diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ad3142a888350649255c8c1f35c0fa5d2709e6c..ed08f8f700e954f383fa62c00c0906d721fe1a48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,46 @@ 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. +### [1.8.1](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.8.0...v1.8.1) (2022-03-09) + + +### Features + +* **prices:** Add new price managment with remote doctype ([e516949](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/e5169492eff2579c758429ed636b2177faf94c06)) + + +### Bug Fixes + +* **consumption:** display € and color correctly in consumption visualizer ([12789b6](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/12789b6c8e24bb856f24badfcbce5f348f27ef33)) +* **consumption:** handle missing data at begining/end of month or year ([67a0f51](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/67a0f51d83f6197a3b1fc620d2b6772baf95cab8)) +* **konnector:** display loader when delete konnector ([350a928](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/350a928677de67fa7057fcb4182460772c34768c)) +* **splash:** change unkown error message on the splash screen ([7cec99d](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/7cec99d10207e0ced2b6590f748426fddfcf27a6)) + +## [1.8.0](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.7.4...v1.8.0) (2022-03-03) + + +### Features + +* **connection:** handle correclty several accounts on a konnector ([429352f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/429352fa12b173cc15b778fb7014a49705ea9005)) +* **connexion:** Add possibility to inform user when consent is outdated and refresh consent ([74a7659](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/74a76592fadb025a4b1089ec62f357167c2e078f)) +* **consumption:** refacto of dataload visualizer ([921a1b7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/921a1b7913766fea3a6265648d5b9d9815d8f8db)) +* **ecogesture:** update equipment ([57cff15](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/57cff151e88e44d5a478f964be728ee8ab9e2c1c)) +* enhance information in the half an hour consent display ([ad78d5b](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/ad78d5bdd8c2326cf00043716a88d21de6ad8662)) +* **newsletter:** retrieve newsletter object from the backoffice ([fc6e050](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/fc6e0504844dd3f809b1bf5e94a4de34a4c93a79)) +* **splash:** Displays progess bar and better error managment ([19e44c8](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/19e44c8c54f7297e04c0ab90397c9ea679eda86e)) + + +### Bug Fixes + +* **connection:** handle correctly the loginSuccess step in order to prevent infinite loading on connection modal ([d626b90](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/d626b901d37e6a26e910ce921f3af465929452f0)) +* **conso:** Now recent data without fluidprice are taken into account in the total consumption ([4e91f35](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4e91f357f6a3065773ef77a006ecdb92fbefa690)) +* **conso:** Prevent today button to set current hour ([367cb7f](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/367cb7fb6c06aa6184455ad9f9ad331f71d67c3c)) +* **consumptionAlert:** Display empty field instead of 0 by default ([f9733a2](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/f9733a2808bd8f8e0196470228b03ab4c3fab66e)) +* day alert in water consumption limit email ([3e4f298](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/3e4f29844613b353c296847472d9cf9ed571254c)) +* **enedisAnalysis:** Prevent service to launch if no data ([feb09ee](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/feb09ee166954254d949ff60f51cabb91875a137)) +* **newsletter:** new image format ([4d19de7](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/4d19de734fa42535666de3e27d12ee053ce72d56)) +* **newsletter:** new image format ([02ff2b3](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/commit/02ff2b37aea3e96e5a76cede796a1ad5bbc9ea7d)) + ### [1.7.4](https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/compare/v1.7.3...v1.7.4) (2022-02-07) ### Bug Fixes diff --git a/manifest.webapp b/manifest.webapp index f0e802d3dbaee9a8c9f769315007fa2829111189..53c86d0aaba198f890b888a7e8002be3a15cab0e 100644 --- a/manifest.webapp +++ b/manifest.webapp @@ -3,7 +3,7 @@ "slug": "ecolyo", "icon": "icon.svg", "categories": ["energy"], - "version": "1.7.4", + "version": "1.8.1", "licence": "AGPL-3.0", "editor": "Métropole de Lyon", "default_locale": "fr", @@ -65,6 +65,12 @@ }, "backoffice-partners-info": { "description": "Requis pour la récupération du status des services partenaires" + }, + "backoffice-prices-rec": { + "description": "Requis pour la récupération du prix des fluides dans un environnement de test." + }, + "backoffice-prices": { + "description": "Requis pour la récupération du prix des fluides." } } }, @@ -125,6 +131,12 @@ }, "backoffice-partners-info": { "description": "Required for getting the status of partners' services" + }, + "backoffice-prices-rec": { + "description": "Required for getting fluid prices form backoffice rec." + }, + "backoffice-prices": { + "description": "Required for getting fluid prices form backoffice prod" } } } @@ -231,6 +243,14 @@ "backoffice-partners-info": { "type": "org.ecolyo.backoffice.partners.info", "verbs": ["ALL"] + }, + "backoffice-prices-rec": { + "type": "org.ecolyo.backoffice.prices.rec", + "verbs": ["ALL"] + }, + "backoffice-prices": { + "type": "org.ecolyo.backoffice.prices", + "verbs": ["ALL"] } } } diff --git a/package.json b/package.json index 8cfcfa24a248c7572687ca711f2e1368c6ba436b..cb2977e11e0af5c68951c6151b4bef4db54200e6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ecolyo", - "version": "1.7.4", + "version": "1.8.1", "scripts": { "tx": "tx pull --all || true", "lint": "yarn lint:js && yarn lint:styles", diff --git a/src/assets/icons/email/multifluidConsumption.png b/src/assets/icons/email/multifluidConsumption.png new file mode 100644 index 0000000000000000000000000000000000000000..c1e53b07b8b14f9e50e9051288fd84550acebb97 Binary files /dev/null and b/src/assets/icons/email/multifluidConsumption.png differ diff --git a/src/assets/icons/email/multifluidConsumption.svg b/src/assets/icons/email/multifluidConsumption.svg deleted file mode 100644 index ab277d963f5ad6d49c32e9d25046f1631a669775..0000000000000000000000000000000000000000 --- a/src/assets/icons/email/multifluidConsumption.svg +++ /dev/null @@ -1,42 +0,0 @@ -<svg width="132" height="101" viewBox="0 0 132 101" fill="none" xmlns="http://www.w3.org/2000/svg"> -<mask id="path-1-outside-1" maskUnits="userSpaceOnUse" x="5.19354" y="26.5161" width="48" height="58" fill="black"> -<rect fill="white" x="5.19354" y="26.5161" width="48" height="58"/> -<path d="M49.3242 31.1333C43.0891 29.9235 36.6391 30.4998 30.7172 32.7958C24.7954 35.0918 19.6427 39.0141 15.8528 44.1107C12.0628 49.2074 9.78985 55.2711 9.29572 61.6032C8.80158 67.9353 10.1064 74.2782 13.0598 79.9011L42.9032 64.2258L49.3242 31.1333Z"/> -</mask> -<path d="M49.3242 31.1333C43.0891 29.9235 36.6391 30.4998 30.7172 32.7958C24.7954 35.0918 19.6427 39.0141 15.8528 44.1107C12.0628 49.2074 9.78985 55.2711 9.29572 61.6032C8.80158 67.9353 10.1064 74.2782 13.0598 79.9011L42.9032 64.2258L49.3242 31.1333Z" stroke="#FFC600" stroke-width="6.12903" mask="url(#path-1-outside-1)"/> -<mask id="path-2-outside-2" maskUnits="userSpaceOnUse" x="5.19354" y="26.5161" width="75" height="75" fill="black"> -<rect fill="white" x="5.19354" y="26.5161" width="75" height="75"/> -<path d="M49.3242 31.1333C40.6684 29.4538 31.6992 31.2325 24.3395 36.0881C16.9797 40.9437 11.8154 48.4895 9.9536 57.1079C8.09182 65.7262 9.68086 74.731 14.38 82.1916C19.0792 89.6521 26.5144 94.9746 35.0915 97.0178C43.6686 99.0611 52.7049 97.6625 60.263 93.1218C67.8211 88.5812 73.2993 81.2599 75.5231 72.7278C77.7469 64.1957 76.5393 55.1319 72.1592 47.4797C67.779 39.8275 60.5751 34.196 52.0918 31.7926L42.9032 64.2258L49.3242 31.1333Z"/> -</mask> -<path d="M49.3242 31.1333C40.6684 29.4538 31.6992 31.2325 24.3395 36.0881C16.9797 40.9437 11.8154 48.4895 9.9536 57.1079C8.09182 65.7262 9.68086 74.731 14.38 82.1916C19.0792 89.6521 26.5144 94.9746 35.0915 97.0178C43.6686 99.0611 52.7049 97.6625 60.263 93.1218C67.8211 88.5812 73.2993 81.2599 75.5231 72.7278C77.7469 64.1957 76.5393 55.1319 72.1592 47.4797C67.779 39.8275 60.5751 34.196 52.0918 31.7926L42.9032 64.2258L49.3242 31.1333Z" stroke="#FFC600" stroke-width="6.12903" stroke-linejoin="round" mask="url(#path-2-outside-2)"/> -<mask id="path-3-outside-3" maskUnits="userSpaceOnUse" x="5.19354" y="54.5161" width="41" height="29" fill="black"> -<rect fill="white" x="5.19354" y="54.5161" width="41" height="29"/> -<path d="M13.1599 80.0901C9.48504 73.2003 8.31607 65.2484 9.85263 57.5925L42.9032 64.2258L13.1599 80.0901Z"/> -</mask> -<path d="M13.1599 80.0901C9.48504 73.2003 8.31607 65.2484 9.85263 57.5925L42.9032 64.2258L13.1599 80.0901Z" stroke="#FFC600" stroke-width="6.12903" stroke-linejoin="round" mask="url(#path-3-outside-3)"/> -<g clip-path="url(#clip0)"> -<circle cx="94.6153" cy="19.3846" r="15.8549" fill="#121212" stroke="#D87B39" stroke-width="1.5"/> -<path d="M78.7552 19.9511L82.5315 22.9721L85.5525 17.6853L89.3287 25.993L93.8601 13.1539L97.6364 25.2378L101.413 16.1748L105 24.3893L108.21 19.0183L110.476 21.6504" stroke="#D87B39" stroke-width="1.5"/> -</g> -<g clip-path="url(#clip1)"> -<circle cx="78" cy="51.2307" r="15.8549" fill="#121212" stroke="#3A98EC" stroke-width="1.5"/> -<path d="M62.8951 56.1199C63.7905 53.6578 66.7897 48.7336 71.6244 48.7336C77.6677 48.7336 77.6677 56.1199 83.7111 56.1199C88.5457 56.1199 90.4259 50.7481 93.1118 49.4051" stroke="#3A98EC" stroke-width="1.5"/> -</g> -<g clip-path="url(#clip2)"> -<circle cx="114" cy="51.2307" r="15.8549" fill="#121212" stroke="#45D1B8" stroke-width="1.5"/> -<circle cx="108.713" cy="52.7413" r="3.77098" fill="#121212" stroke="#45D1B8" stroke-width="1.5"/> -<path d="M116.266 61.0437C117.514 61.0437 118.526 60.0316 118.526 58.7832C118.526 57.5348 117.514 56.5227 116.266 56.5227C115.017 56.5227 114.005 57.5348 114.005 58.7832C114.005 60.0316 115.017 61.0437 116.266 61.0437Z" fill="#121212" stroke="#45D1B8" stroke-width="1.5"/> -<path d="M115.51 53.4912C118.844 53.4912 121.547 50.7885 121.547 47.4545C121.547 44.1205 118.844 41.4178 115.51 41.4178C112.176 41.4178 109.474 44.1205 109.474 47.4545C109.474 50.7885 112.176 53.4912 115.51 53.4912Z" fill="#121212" stroke="#45D1B8" stroke-width="1.5"/> -</g> -<defs> -<clipPath id="clip0"> -<rect width="33.2308" height="33.2308" fill="white" transform="translate(78 2.76923)"/> -</clipPath> -<clipPath id="clip1"> -<rect width="33.2308" height="33.2308" fill="white" transform="translate(61.3846 34.6154)"/> -</clipPath> -<clipPath id="clip2"> -<rect width="33.2308" height="33.2308" fill="white" transform="translate(97.3846 34.6154)"/> -</clipPath> -</defs> -</svg> diff --git a/src/assets/icons/ico/consent-outdated-enedis.svg b/src/assets/icons/ico/consent-outdated-enedis.svg new file mode 100644 index 0000000000000000000000000000000000000000..de4656ebedab56954932628af7436a5edf8703ad --- /dev/null +++ b/src/assets/icons/ico/consent-outdated-enedis.svg @@ -0,0 +1,17 @@ +<svg width="135" height="84" viewBox="0 0 135 84" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M22.5 14.5H104.5V64C104.5 65.933 102.933 67.5 101 67.5H26C24.067 67.5 22.5 65.933 22.5 64V14.5Z" fill="white" stroke="#A2B4C1"/> +<path d="M22 10C22 7.79086 23.7909 6 26 6H101C103.209 6 105 7.79086 105 10V14H22V10Z" fill="#A2B4C1"/> +<circle cx="27" cy="11" r="2" fill="#FF5F5F"/> +<circle cx="33" cy="11" r="2" fill="#FFB850"/> +<circle cx="39" cy="11" r="2" fill="#3CE800"/> +<path d="M60.3439 44.6218C58.9691 44.6218 57.8473 43.6259 57.8473 42.3731V41.9661H63.1704C65.0071 41.9661 66.5138 40.6062 66.5138 38.9464V37.0295C66.5138 35.359 65.0181 34.0098 63.1704 34.0098H58.5292C58.2652 34.0098 58.0122 34.0098 57.7483 34.0633C56.2415 34.3846 55.1857 35.6267 55.1857 37.0295V38.1432C55.1857 38.4002 55.3727 38.6037 55.6146 38.6037H57.4183C57.6493 38.6037 57.8473 38.4002 57.8473 38.1432V37.8648V37.4258C57.8473 36.8475 58.3752 36.3763 59.0351 36.3763H62.6755C63.3244 36.3763 63.8633 36.8475 63.8633 37.4258V38.5609C63.8633 39.1391 63.3354 39.6103 62.6755 39.6103H53.668V41.9661H55.1857V42.3731C55.1857 44.9217 57.5063 46.9884 60.3549 46.9884H68.0426V44.6218H60.3439Z" fill="#91C21D"/> +<path d="M48.521 36.3763C49.8958 36.3763 51.0176 37.3936 51.0176 38.6358V46.5708C51.0176 46.7956 51.2266 46.9884 51.4905 46.9884H53.1952C53.4592 46.9884 53.6682 46.8063 53.6682 46.5708V38.6358C53.6682 36.0872 51.3585 34.0098 48.521 34.0098H43.0329C42.802 34.0098 42.604 34.2132 42.604 34.4702V46.5279C42.604 46.7849 42.791 46.9884 43.0329 46.9884H44.8366C45.0676 46.9884 45.2656 46.7849 45.2656 46.5279V36.3763H48.521Z" fill="#0063A6"/> +<path d="M33.6184 36.3783H40.6132C40.8662 36.3783 41.0752 36.1962 41.0752 35.9714V34.4186C41.0752 34.1938 40.8772 34.0117 40.6132 34.0117H33.5634C31.6057 34.0117 30 35.4466 30 37.2028V43.8099C30 45.5661 31.5947 47.0011 33.5634 47.0011H40.6132C40.8662 47.0011 41.0752 46.819 41.0752 46.5941V45.0414C41.0752 44.8165 40.8662 44.6345 40.6132 44.6345H33.6184C33.1015 44.6345 32.6726 44.2383 32.6726 43.7671V41.9574H36.8519C37.1048 41.9574 37.3138 41.7753 37.3138 41.5505V40.0299C37.3138 39.805 37.1048 39.6229 36.8519 39.6229H32.6726V37.2457C32.6726 36.7745 33.1015 36.3783 33.6184 36.3783Z" fill="#0063A6"/> +<path d="M96.0001 42.5132C96.0001 42.3954 96.0001 42.2776 95.9891 42.1491C95.8571 40.7035 94.3284 39.6112 92.7226 39.6112H88.7303H88.6313C87.9934 39.6112 87.4765 39.0544 87.4765 38.3798V37.5017C87.4765 36.8806 88.0374 36.3773 88.7413 36.3773H90.314H90.325H94.3064C94.5153 36.3773 94.6913 36.2595 94.7573 36.0881C94.7793 36.0453 94.7793 36.0025 94.7793 35.9596V34.4176C94.7793 34.1928 94.5703 34 94.3064 34H88.0924C86.2887 34 84.804 35.3171 84.804 36.9448V38.7867C84.804 40.5429 86.1567 41.9671 87.8285 41.9671H92.1837C92.8216 41.9671 93.3385 42.5239 93.3385 43.1985V43.4877C93.3385 44.1088 92.7776 44.6121 92.0847 44.6121H85.2879C85.0789 44.6121 84.9029 44.7299 84.8369 44.9012C84.815 44.944 84.815 44.9869 84.815 45.0297V46.5717C84.815 46.7966 85.0239 46.9893 85.2879 46.9893H90.853H92.7446C94.5483 46.9893 96.0001 45.6722 96.0001 44.0445V42.5132Z" fill="#0063A6"/> +<path d="M74.2567 34.0098H68.4717C68.2407 34.0098 68.0427 34.2132 68.0427 34.4702V42.1053C68.0427 42.3623 68.2297 42.5658 68.4717 42.5658H70.2754C70.5063 42.5658 70.7043 42.3623 70.7043 42.1053V36.3763H73.9597C75.3345 36.3763 76.4563 37.3936 76.4563 38.6358V42.8014C76.4563 44.0436 75.3345 44.6218 73.9597 44.6218L68.0427 44.6325V46.9991H73.9597C76.7973 46.9991 79.1069 45.3714 79.1069 42.8121V38.6144C79.1069 36.1622 76.9952 34.0098 74.2567 34.0098Z" fill="#0063A6"/> +<path d="M83.2861 42.1821V37.8452C83.2861 37.5882 83.0991 37.3848 82.8572 37.3848H81.0644C80.8335 37.3848 80.6355 37.5882 80.6355 37.8452V42.1821V46.5191C80.6355 46.7761 80.8225 46.9795 81.0644 46.9795H82.8572C83.0881 46.9795 83.2861 46.7761 83.2861 46.5191V42.1821Z" fill="#0063A6"/> +<path d="M83.2861 34.9949V34.4702C83.2861 34.2132 83.0991 34.0098 82.8572 34.0098H81.0644C80.8335 34.0098 80.6355 34.2132 80.6355 34.4702V34.9949V35.9159C80.6355 36.1729 80.8225 36.3763 81.0644 36.3763H82.8572C83.0881 36.3763 83.2861 36.1729 83.2861 35.9159V34.9949Z" fill="#0063A6"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M118.522 75.1521C119.137 74.0979 119.159 73.0437 118.588 71.9896L102.775 44.5812C102.16 43.5271 101.238 43 100.008 43C98.7781 43 97.8557 43.5271 97.2407 44.5812L81.4283 71.9896C80.8572 73.0437 80.8572 74.0979 81.4283 75.1521C82.0432 76.2062 82.9656 76.7333 84.1954 76.7333H115.82C117.05 76.7333 117.951 76.2062 118.522 75.1521ZM101.564 62.292V56H98.374V62.292C98.374 62.9667 98.4143 63.6377 98.495 64.305C98.5757 64.965 98.682 65.6397 98.814 66.329H101.124C101.256 65.6397 101.362 64.965 101.443 64.305C101.524 63.6377 101.564 62.9667 101.564 62.292ZM98.143 69.563C98.0477 69.7903 98 70.036 98 70.3C98 70.564 98.0477 70.8133 98.143 71.048C98.2457 71.2753 98.3813 71.4733 98.55 71.642C98.726 71.8107 98.9313 71.9427 99.166 72.038C99.4007 72.1333 99.6573 72.181 99.936 72.181C100.207 72.181 100.46 72.1333 100.695 72.038C100.93 71.9427 101.135 71.8107 101.311 71.642C101.487 71.4733 101.623 71.2753 101.718 71.048C101.821 70.8133 101.872 70.564 101.872 70.3C101.872 70.036 101.821 69.7903 101.718 69.563C101.623 69.3357 101.487 69.1377 101.311 68.969C101.135 68.8003 100.93 68.6683 100.695 68.573C100.46 68.4703 100.207 68.419 99.936 68.419C99.6573 68.419 99.4007 68.4703 99.166 68.573C98.9313 68.6683 98.726 68.8003 98.55 68.969C98.3813 69.1377 98.2457 69.3357 98.143 69.563Z" fill="#EC9D41"/> +<path d="M101.564 56V62.292C101.564 62.9667 101.524 63.6377 101.443 64.305C101.362 64.965 101.256 65.6397 101.124 66.329H98.814C98.682 65.6397 98.5757 64.965 98.495 64.305C98.4143 63.6377 98.374 62.9667 98.374 62.292V56H101.564Z" fill="#121212"/> +<path d="M98 70.3C98 70.036 98.0477 69.7903 98.143 69.563C98.2457 69.3357 98.3813 69.1377 98.55 68.969C98.726 68.8003 98.9313 68.6683 99.166 68.573C99.4007 68.4703 99.6573 68.419 99.936 68.419C100.207 68.419 100.46 68.4703 100.695 68.573C100.93 68.6683 101.135 68.8003 101.311 68.969C101.487 69.1377 101.623 69.3357 101.718 69.563C101.821 69.7903 101.872 70.036 101.872 70.3C101.872 70.564 101.821 70.8133 101.718 71.048C101.623 71.2753 101.487 71.4733 101.311 71.642C101.135 71.8107 100.93 71.9427 100.695 72.038C100.46 72.1333 100.207 72.181 99.936 72.181C99.6573 72.181 99.4007 72.1333 99.166 72.038C98.9313 71.9427 98.726 71.8107 98.55 71.642C98.3813 71.4733 98.2457 71.2753 98.143 71.048C98.0477 70.8133 98 70.564 98 70.3Z" fill="#121212"/> +</svg> diff --git a/src/assets/icons/ico/consent-outdated-grdf.svg b/src/assets/icons/ico/consent-outdated-grdf.svg new file mode 100644 index 0000000000000000000000000000000000000000..3748cba0b02a86004bd267bfa151a29538bbb750 --- /dev/null +++ b/src/assets/icons/ico/consent-outdated-grdf.svg @@ -0,0 +1,17 @@ +<svg width="135" height="84" viewBox="0 0 135 84" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M22.5 14.5H104.5V64C104.5 65.933 102.933 67.5 101 67.5H26C24.067 67.5 22.5 65.933 22.5 64V14.5Z" fill="white" stroke="#A2B4C1"/> +<path d="M22 10C22 7.79086 23.7909 6 26 6H101C103.209 6 105 7.79086 105 10V14H22V10Z" fill="#A2B4C1"/> +<circle cx="27" cy="11" r="2" fill="#FF5F5F"/> +<circle cx="33" cy="11" r="2" fill="#FFB850"/> +<circle cx="39" cy="11" r="2" fill="#3CE800"/> +<path d="M67.9203 53.1792C67.9203 53.4651 67.6815 53.6937 67.3936 53.6937H57.6778C57.3919 53.6937 57.1592 53.4651 57.1592 53.1792V51.703C57.1592 51.4186 57.3919 51.1875 57.6778 51.1875H67.3936C67.6815 51.1875 67.9203 51.4186 67.9203 51.703V53.1792Z" fill="#FAB200"/> +<path d="M81.3997 29.0352V37.8027C82.1987 37.1548 83.4677 36.9386 85.4555 36.8116L85.451 32.8601H88.6257C90.2952 32.7859 94.0078 32.2949 94.0002 29.0352H81.3997Z" fill="#71B857"/> +<path d="M91.0006 36.7112H91.8417C91.8417 36.7112 91.8396 37.3039 91.8396 37.5355C91.8396 39.3558 90.2158 40.2787 87.0208 40.2787H85.4512V43.2939C85.4512 44.3552 85.1947 46.8046 82.7596 46.8559H81.3994V42.4392C81.7847 37.3422 88.6178 36.766 91.0006 36.7112Z" fill="#71B857"/> +<path d="M72.513 29.0401L63.6738 29.0371V46.8561C66.7547 46.4816 67.8813 45.0447 68.0445 42.9265V32.8586H71.93C71.9779 32.8617 72.0321 32.8647 72.0867 32.8677C72.1806 32.8728 72.2753 32.878 72.3391 32.884C74.1825 33.1001 75.3572 33.896 75.4763 37.5492C75.49 37.6922 75.4857 37.853 75.4818 37.999C75.48 38.0635 75.4784 38.1253 75.4784 38.1812C75.3836 44.0994 70.7994 45.9118 68.26 46.5732L68.2468 46.5777C68.2164 46.5902 68.1946 46.6051 68.1946 46.6355V46.7949C68.1946 46.8272 68.2204 46.8516 68.2468 46.8551L68.2554 46.8561H68.553C72.2545 46.8561 79.6934 45.9721 79.6934 37.986V37.84C79.6498 30.9187 76.614 29.0401 72.513 29.0401Z" fill="#00B1AF"/> +<path d="M55.9604 32.8746L53.8711 32.8576C53.7378 32.8576 53.608 32.8522 53.4752 32.8427C50.9002 32.6619 49.429 30.734 48.8292 29.723C48.6918 29.5158 48.561 29.3031 48.4373 29.0785C48.4373 29.0785 48.4247 29.0352 48.446 29.0352H54.4217C56.4213 29.0352 57.2542 29.1567 58.1394 29.4973C58.3483 29.574 58.5658 29.6687 58.7965 29.7738C60.0796 30.3664 60.9491 31.4283 61.2969 32.7904C61.3486 32.9782 61.3815 33.1789 61.4099 33.3796C61.449 33.6441 61.4713 33.9195 61.4713 34.2044C61.4753 36.3225 60.4016 37.5303 58.9161 38.376C58.9141 38.3795 58.8897 38.3934 58.8897 38.3934C58.8695 38.4009 58.8695 38.4009 58.8578 38.4103C58.8414 38.4182 58.8268 38.4269 58.8132 38.4351C58.8045 38.4402 58.7961 38.4452 58.7878 38.4497C58.7833 38.4497 58.7615 38.4656 58.7615 38.4656C58.5881 38.5513 58.4177 38.6041 58.2591 38.6424C58.2341 38.6475 58.2102 38.6538 58.1878 38.6598C58.1683 38.6649 58.1498 38.6698 58.1328 38.6733V34.5012C58.0781 33.2152 56.9262 32.8791 56.2636 32.8791C56.2426 32.8791 56.221 32.8793 56.1987 32.8795C56.1262 32.8802 56.0469 32.8811 55.9604 32.8746Z" fill="#009BC4"/> +<path d="M51.5207 37.7184C50.5138 37.7568 50.4165 38.6687 50.4048 38.8475V41.5379H54.1864C54.5051 41.9981 54.8222 42.4536 55.1171 42.8771L55.4523 43.3588C55.8782 43.9609 56.2868 44.5292 56.4567 44.7468C56.4682 44.7619 56.4817 44.7807 56.4975 44.8027C56.7122 45.1016 57.3588 46.0022 59.5918 46.5408C60.4088 46.7368 61.3089 46.7951 61.8124 46.8277C61.9036 46.8336 61.9823 46.8387 62.0446 46.8436L62.2687 46.8546L62.2449 46.8117C62.2449 46.8117 61.8403 46.2609 61.3293 45.3923L61.2179 45.2029C60.5143 44.0058 58.1279 39.9455 57.6699 39.1528C57.2572 38.4381 56.6001 38.1199 55.9279 37.9266H55.9213C55.4397 37.7951 54.9109 37.7448 54.5149 37.7249C54.4974 37.7242 54.4803 37.7231 54.4632 37.7221C54.4333 37.7203 54.4036 37.7184 54.373 37.7184H51.5207Z" fill="#009BC4"/> +<path d="M46.9584 37.7197C47.9171 37.7636 48.0484 38.6053 48.0641 38.8259V43.1903C48.0425 43.2177 48.0206 43.2456 47.9985 43.2738C47.9037 43.3946 47.805 43.5204 47.7027 43.6335C47.5151 43.8372 47.2155 44.1515 47.1029 44.2571C45.043 46.1895 42.6227 46.8932 40.3651 46.8932C38.5096 46.8932 35.9564 46.3135 33.7815 44.2531C30.0917 40.7429 30.0547 35.122 33.7795 31.6451C34.4695 31.0056 34.7367 30.7666 35.8348 30.15C37.3501 29.2958 39.0678 29 40.4554 29C41.6737 29 43.0075 29.2605 44.0063 29.6684C44.239 29.7615 44.5016 29.8726 44.8316 30.0608C45.7153 30.5658 46.8748 31.4514 47.4542 32.8514V32.8578H36.5562V39.3987C36.6388 40.5646 36.8954 41.4899 37.6198 42.1404C38.2049 42.6678 39.0987 43.0135 40.4554 43.1494C40.8899 43.1957 41.3766 43.2181 41.917 43.2181L44.2856 43.2127C44.2633 43.2052 44.1736 43.1494 43.8451 42.746C43.4364 42.2385 43.3447 41.3699 43.3447 40.721H43.3426V37.7188L46.9584 37.7197Z" fill="#0053A2"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M118.522 75.1521C119.137 74.0979 119.159 73.0437 118.588 71.9896L102.775 44.5812C102.16 43.5271 101.238 43 100.008 43C98.7781 43 97.8557 43.5271 97.2407 44.5812L81.4283 71.9896C80.8572 73.0437 80.8572 74.0979 81.4283 75.1521C82.0432 76.2062 82.9656 76.7333 84.1954 76.7333H115.82C117.05 76.7333 117.951 76.2062 118.522 75.1521ZM101.564 62.292V56H98.374V62.292C98.374 62.9667 98.4143 63.6377 98.495 64.305C98.5757 64.965 98.682 65.6397 98.814 66.329H101.124C101.256 65.6397 101.362 64.965 101.443 64.305C101.524 63.6377 101.564 62.9667 101.564 62.292ZM98.143 69.563C98.0477 69.7903 98 70.036 98 70.3C98 70.564 98.0477 70.8133 98.143 71.048C98.2457 71.2753 98.3813 71.4733 98.55 71.642C98.726 71.8107 98.9313 71.9427 99.166 72.038C99.4007 72.1333 99.6573 72.181 99.936 72.181C100.207 72.181 100.46 72.1333 100.695 72.038C100.93 71.9427 101.135 71.8107 101.311 71.642C101.487 71.4733 101.623 71.2753 101.718 71.048C101.821 70.8133 101.872 70.564 101.872 70.3C101.872 70.036 101.821 69.7903 101.718 69.563C101.623 69.3357 101.487 69.1377 101.311 68.969C101.135 68.8003 100.93 68.6683 100.695 68.573C100.46 68.4703 100.207 68.419 99.936 68.419C99.6573 68.419 99.4007 68.4703 99.166 68.573C98.9313 68.6683 98.726 68.8003 98.55 68.969C98.3813 69.1377 98.2457 69.3357 98.143 69.563Z" fill="#EC9D41"/> +<path d="M101.564 56V62.292C101.564 62.9667 101.524 63.6377 101.443 64.305C101.362 64.965 101.256 65.6397 101.124 66.329H98.814C98.682 65.6397 98.5757 64.965 98.495 64.305C98.4143 63.6377 98.374 62.9667 98.374 62.292V56H101.564Z" fill="#121212"/> +<path d="M98 70.3C98 70.036 98.0477 69.7903 98.143 69.563C98.2457 69.3357 98.3813 69.1377 98.55 68.969C98.726 68.8003 98.9313 68.6683 99.166 68.573C99.4007 68.4703 99.6573 68.419 99.936 68.419C100.207 68.419 100.46 68.4703 100.695 68.573C100.93 68.6683 101.135 68.8003 101.311 68.969C101.487 69.1377 101.623 69.3357 101.718 69.563C101.821 69.7903 101.872 70.036 101.872 70.3C101.872 70.564 101.821 70.8133 101.718 71.048C101.623 71.2753 101.487 71.4733 101.311 71.642C101.135 71.8107 100.93 71.9427 100.695 72.038C100.46 72.1333 100.207 72.181 99.936 72.181C99.6573 72.181 99.4007 72.1333 99.166 72.038C98.9313 71.9427 98.726 71.8107 98.55 71.642C98.3813 71.4733 98.2457 71.2753 98.143 71.048C98.0477 70.8133 98 70.564 98 70.3Z" fill="#121212"/> +</svg> diff --git a/src/assets/png/logos_partenaires.svg b/src/assets/png/logos_partenaires.svg new file mode 100644 index 0000000000000000000000000000000000000000..773f8e060aa5abe7233915a3481f2c89d9e12f12 --- /dev/null +++ b/src/assets/png/logos_partenaires.svg @@ -0,0 +1,43 @@ +<svg width="360" height="127" viewBox="0 0 360 127" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M119.906 18.3796C119.322 18.9802 118.617 19.4634 117.832 19.8005C117.047 20.1376 116.198 20.3217 115.336 20.3418C114.475 20.3619 113.618 20.2176 112.816 19.9175C112.014 19.6174 111.285 19.1677 110.67 18.595C109.027 17.0388 109 15.5283 109 11.6732C109 7.8182 109.032 6.30508 110.67 4.74887C111.263 4.19147 111.965 3.75009 112.738 3.45001C113.51 3.14993 114.338 2.99702 115.173 3.00004C118.337 3.00004 120.765 4.96431 121.33 7.98294H119.965C119.43 5.63596 117.612 4.15072 115.181 4.15072C114.548 4.14522 113.921 4.2589 113.335 4.48516C112.749 4.71143 112.216 5.04575 111.768 5.46868C110.47 6.70047 110.371 8.00829 110.371 11.6732C110.371 15.3382 110.472 16.6561 111.763 17.8752C112.211 18.2983 112.743 18.6327 113.329 18.859C113.915 19.0852 114.543 19.1988 115.176 19.1932C115.891 19.1971 116.598 19.0509 117.246 18.7651C117.894 18.4794 118.467 18.0612 118.924 17.5407C119.703 16.6308 120.008 15.6246 120.008 14.1647V12.6313H115.173V11.4806H121.373V14.2686C121.373 16.0428 120.969 17.31 119.906 18.3897" fill="white"/> +<path d="M132.857 4.29396H127.543V11.193H132.857C135.159 11.193 136.829 10.0905 136.829 7.74347C136.829 5.39648 135.159 4.29396 132.857 4.29396ZM136.803 20.2008L132.501 12.3437H127.543V20.2008H126.178V3.15088H133.033C135.978 3.15088 138.195 4.75525 138.195 7.72573C138.195 10.2603 136.575 11.9179 134.045 12.3259L138.395 20.2084L136.803 20.2008Z" fill="white"/> +<path d="M147.632 4.86677L143.863 14.9036H151.401L147.632 4.86677V4.86677ZM153.401 20.1982L151.832 16.0542H143.432L141.863 20.1982H140.396L147.024 3.15088H148.24L154.868 20.2084L153.401 20.1982Z" fill="white"/> +<path d="M169.788 20.198L159.391 5.37101V20.198H158.026V3.14062H159.391L169.788 17.922V3.14062H171.156V20.198H169.788Z" fill="white"/> +<path d="M186.306 5.60938C185.27 4.59557 183.878 4.29396 182.436 4.29396H178.083V19.0475H182.433C183.876 19.0475 185.268 18.7358 186.304 17.7296C187.744 16.3406 187.642 13.322 187.642 11.4312C187.642 9.54046 187.741 7.00085 186.304 5.60178L186.306 5.60938ZM187.265 18.6344C186.194 19.6482 184.636 20.1906 182.762 20.1906H176.718V3.15088H182.765C184.639 3.15088 186.205 3.70341 187.268 4.70962C189.091 6.43311 189.013 9.14 189.013 11.4414C189.013 13.7427 189.091 16.916 187.268 18.642L187.265 18.6344Z" fill="white"/> +<path d="M193.186 20.198V3.14062H196.704V17.2276H204.877V20.198H193.186Z" fill="white"/> +<path d="M212.588 13.2027V20.198H209.097V13.2027L203.682 3.14062H207.502L210.867 10.0194L214.183 3.14062H218.001L212.588 13.2027Z" fill="white"/> +<path d="M228.219 6.88077C227.935 6.58371 227.587 6.34852 227.198 6.19143C226.809 6.03433 226.388 5.95908 225.965 5.97087C225.539 5.95913 225.115 6.0343 224.722 6.19129C224.329 6.34828 223.976 6.58341 223.687 6.88077C223.004 7.59804 222.828 8.40148 222.828 11.671C222.828 14.9406 223.004 15.7415 223.687 16.4613C223.976 16.7585 224.329 16.9935 224.722 17.1505C225.115 17.3075 225.539 17.3827 225.965 17.3712C226.388 17.3828 226.809 17.3075 227.198 17.1504C227.587 16.9933 227.935 16.7582 228.219 16.4613C228.902 15.7415 229.105 14.9406 229.105 11.671C229.105 8.40148 228.905 7.59804 228.219 6.88077V6.88077ZM230.835 18.4762C229.529 19.6751 227.782 20.3456 225.964 20.3456C224.145 20.3456 222.398 19.6751 221.093 18.4762C219.273 16.7527 219.321 14.6187 219.321 11.6736C219.321 8.72844 219.273 6.6045 221.093 4.87089C222.398 3.67199 224.145 3.00146 225.964 3.00146C227.782 3.00146 229.529 3.67199 230.835 4.87089C232.658 6.59437 232.631 8.7259 232.631 11.6736C232.631 14.6212 232.647 16.7527 230.835 18.4762Z" fill="white"/> +<path d="M246.86 20.198L239.726 9.73041V20.198H236.211V3.14062H239.348L246.482 13.5854V3.14062H250V20.198H246.86Z" fill="white"/> +<path d="M228.547 25.5828H228.563C228.647 25.4201 228.779 25.2837 228.943 25.1902C229.107 25.0967 229.295 25.05 229.487 25.0556C230.129 25.0556 230.782 25.3091 230.782 26.9692C230.782 27.9171 230.75 29.0095 229.444 29.0095C229.267 29.0123 229.093 28.9714 228.938 28.891C228.783 28.8105 228.653 28.6933 228.56 28.5508H228.536V30.3731H227.891V25.1317H228.544L228.547 25.5828ZM230.1 26.9692C230.1 26.3964 230.1 25.56 229.28 25.56C228.461 25.56 228.55 26.6144 228.55 27.1948C228.55 27.7017 228.582 28.5051 229.305 28.5051C230.027 28.5051 230.1 27.9906 230.1 26.9768V26.9692Z" fill="white"/> +<path d="M183.597 28.3836H183.581C183.51 28.5791 183.372 28.7466 183.189 28.86C183.007 28.9733 182.789 29.0259 182.572 29.0096C181.72 29.0096 181.474 28.49 181.474 27.7601C181.474 26.6069 182.668 26.5562 183.581 26.5765C183.597 26.0696 183.605 25.5221 182.904 25.5221C182.811 25.5151 182.719 25.5286 182.633 25.5614C182.547 25.5942 182.471 25.6455 182.41 25.7112C182.349 25.7769 182.305 25.8552 182.281 25.9399C182.258 26.0245 182.256 26.1132 182.275 26.1988H181.579C181.611 25.3472 182.087 25.0532 182.938 25.0532C183.972 25.0532 184.242 25.5601 184.242 26.1988V28.0287C184.245 28.3318 184.272 28.6343 184.322 28.9335H183.608L183.597 28.3836ZM182.127 27.8032C182.127 28.1707 182.317 28.5027 182.754 28.5027C183.19 28.5027 183.645 28.2695 183.581 27.0403C182.963 27.0504 182.127 26.9997 182.127 27.8057V27.8032Z" fill="white"/> +<path d="M195.333 28.9341V26.2982C195.333 25.913 195.22 25.5607 194.695 25.5607C194.588 25.5623 194.481 25.5857 194.384 25.6294C194.287 25.6732 194.2 25.7361 194.131 25.8141C194.03 25.9844 193.977 26.1765 193.978 26.3717V28.9316H193.33V25.9231C193.33 25.6696 193.314 25.3959 193.29 25.1323H193.981V25.6063H193.997C194.079 25.4248 194.221 25.2733 194.401 25.1742C194.581 25.0751 194.791 25.0338 194.998 25.0563C195.188 25.0429 195.378 25.0819 195.544 25.1688C195.711 25.2556 195.848 25.3865 195.938 25.5454C196.026 25.3824 196.165 25.2485 196.336 25.1612C196.506 25.0739 196.7 25.0374 196.893 25.0563C197.316 25.0563 197.991 25.1475 197.991 26.0422V28.9341H197.338V26.2982C197.338 25.913 197.228 25.5607 196.701 25.5607C196.612 25.5475 196.522 25.5534 196.437 25.578C196.352 25.6025 196.273 25.6452 196.208 25.7026C196.05 25.8926 195.971 26.1305 195.986 26.3717V28.9316L195.333 28.9341Z" fill="white"/> +<path d="M202.742 27.2306C202.742 28.2925 203.045 28.4978 203.545 28.4978C203.99 28.4978 204.223 28.1582 204.244 27.7755H204.959C204.959 28.6195 204.402 29.0022 203.559 29.0022C202.715 29.0022 202.033 28.7488 202.033 27.081C202.033 25.9658 202.167 25.0534 203.559 25.0534C204.704 25.0534 204.991 25.649 204.991 26.9061V27.2306H202.742ZM204.308 26.7642C204.308 25.6566 203.982 25.5223 203.505 25.5223C203.093 25.5223 202.75 25.7098 202.742 26.7642H204.308ZM204.469 23.4946L203.427 24.5566H202.892L203.601 23.4946H204.469Z" fill="white"/> +<path d="M209.42 25.1318V24.4018L210.073 24.123V25.1369H210.948V25.6032H210.073V27.9299C210.073 28.1834 210.073 28.4799 210.67 28.4799C210.718 28.4799 210.82 28.4647 210.964 28.4495V28.9235C210.75 28.9387 210.533 28.9843 210.319 28.9843C209.698 28.9843 209.42 28.7308 209.42 28.3076V25.5981H208.761V25.1318H209.42Z" fill="white"/> +<path d="M215.82 25.7098H215.845C216.112 25.1294 216.45 25.0635 217.084 25.0635V25.7047L216.91 25.6819C216.852 25.6727 216.794 25.6676 216.736 25.6667C216.013 25.6667 215.828 26.1863 215.828 26.6982V28.9438H215.175V25.142H215.828L215.82 25.7098Z" fill="white"/> +<path d="M220.793 27.0882C220.793 25.973 220.927 25.0605 222.319 25.0605C223.711 25.0605 223.845 25.9806 223.845 27.0882C223.845 28.7685 223.167 29.0093 222.319 29.0093C221.47 29.0093 220.793 28.7685 220.793 27.0882ZM223.162 26.8347C223.162 25.7956 222.819 25.5674 222.319 25.5674C221.818 25.5674 221.476 25.793 221.476 26.8347C221.476 28.069 221.644 28.5151 222.319 28.5151C222.993 28.5151 223.165 28.0589 223.165 26.8246L223.162 26.8347Z" fill="white"/> +<path d="M234.77 27.0882C234.77 25.973 234.904 25.0605 236.296 25.0605C237.688 25.0605 237.824 25.9806 237.824 27.0882C237.824 28.7685 237.147 29.0093 236.296 29.0093C235.445 29.0093 234.77 28.7685 234.77 27.0882ZM237.139 26.8347C237.139 25.7956 236.797 25.5674 236.296 25.5674C235.795 25.5674 235.453 25.793 235.453 26.8347C235.453 28.069 235.619 28.5151 236.296 28.5151C236.973 28.5151 237.142 28.0589 237.142 26.8246L237.139 26.8347Z" fill="white"/> +<path d="M242.704 28.9337H242.051V23.4971H242.702L242.704 28.9337Z" fill="white"/> +<path d="M247.517 27.2304C247.517 28.2923 247.82 28.4976 248.32 28.4976C248.764 28.4976 248.997 28.158 249.019 27.7753H249.734C249.734 28.6193 249.177 29.002 248.333 29.002C247.49 29.002 246.808 28.7485 246.808 27.0808C246.808 25.9656 246.941 25.0532 248.333 25.0532C249.479 25.0532 249.766 25.6488 249.766 26.9059V27.2304H247.517ZM249.083 26.764C249.083 25.6564 248.756 25.5221 248.28 25.5221C247.868 25.5221 247.525 25.7097 247.517 26.764H249.083Z" fill="white"/> +<path d="M177.726 28.9337H177.073V23.4971H177.726V28.9337Z" fill="white"/> +<path d="M55.6449 115.375C55.8932 115.375 56.1002 115.54 55.976 115.996L54.8584 116.244C55.0653 115.789 55.3965 115.375 55.6449 115.375ZM56.2658 117.196H56.0588C55.769 117.527 55.4793 117.776 55.1895 117.776C54.8998 117.776 54.7342 117.61 54.7342 117.196C54.7342 117.03 54.7342 116.865 54.7756 116.699L56.5555 116.12C56.8867 115.292 56.4727 114.919 55.976 114.919C55.1481 114.919 54.1547 116.327 54.1547 117.569C54.1547 118.107 54.403 118.438 54.817 118.438C55.3551 118.438 55.8518 117.941 56.2658 117.196ZM55.8932 114.588L57.1351 113.429V113.305H56.4727L55.6863 114.63H55.8932V114.588ZM52.0436 115.416H52.6231L51.671 117.983C51.5882 118.189 51.7124 118.438 51.9194 118.438C52.4575 118.438 53.3268 117.9 53.6165 117.196H53.451C53.2026 117.444 52.7473 117.776 52.3747 117.858L53.244 115.457H54.1133L54.2375 115.085H53.3682L53.6993 114.174H53.3682L52.7473 115.085L52.0022 115.168V115.416H52.0436ZM51.2571 115.292C51.3399 115.044 51.1743 114.919 51.0501 114.919C50.5534 114.919 49.9324 115.375 49.6841 116.037H49.8497C50.0152 115.789 50.305 115.54 50.5534 115.499L49.5599 118.065C49.4771 118.314 49.6427 118.438 49.7669 118.438C50.2636 118.438 50.8431 117.983 51.0915 117.32H50.9259C50.7603 117.569 50.4706 117.817 50.2222 117.858L51.2571 115.292ZM51.4226 114.009C51.671 114.009 51.8366 113.802 51.8366 113.595C51.8366 113.346 51.6296 113.181 51.4226 113.181C51.1743 113.181 51.0087 113.388 51.0087 113.595C51.0087 113.802 51.1743 114.009 51.4226 114.009ZM45.7516 117.941C45.6274 118.231 45.7516 118.438 46.0414 118.438C46.207 118.438 46.2897 118.396 46.3725 118.189L47.0762 116.368C47.4074 115.996 48.0283 115.582 48.3181 115.582C48.525 115.582 48.4836 115.747 48.3595 115.954L47.3246 117.983C47.2418 118.189 47.366 118.438 47.573 118.438C48.0697 118.438 48.6906 117.983 48.939 117.32H48.7734C48.6078 117.569 48.3181 117.817 48.0697 117.858L48.9804 116.037C49.1046 115.789 49.146 115.582 49.146 115.416C49.146 115.126 48.9804 114.919 48.6492 114.919C48.1939 114.919 47.7385 115.416 47.2004 116.037V115.54C47.2004 115.209 47.0762 114.878 46.7865 114.878C46.5795 114.878 46.4139 115.044 46.2484 115.292V115.375C46.5795 115.375 46.7451 115.871 46.4967 116.368L45.7516 117.941ZM45.7516 115.706C45.8758 115.292 45.793 114.919 45.5033 114.919C45.1307 114.919 45.0065 115.209 44.634 116.037V115.54C44.634 115.209 44.5098 114.878 44.22 114.878C43.8475 114.878 43.5163 115.457 43.268 115.996H43.4335C43.5991 115.747 43.7647 115.582 43.8889 115.582C44.0545 115.582 44.1372 115.83 43.8889 116.368L43.1852 117.9C43.061 118.189 43.1852 118.396 43.4749 118.396C43.6405 118.396 43.7233 118.355 43.8061 118.148L44.5098 116.327C44.7168 116.078 44.8823 115.871 45.0893 115.664H45.7516V115.706ZM41.7778 115.375C42.0261 115.375 42.2331 115.54 42.1089 115.996L40.9913 116.244C41.1982 115.789 41.5294 115.375 41.7778 115.375ZM42.3987 117.196H42.1917C41.9019 117.527 41.6122 117.776 41.3224 117.776C41.0327 117.776 40.8671 117.61 40.8671 117.196C40.8671 117.03 40.8671 116.865 40.9085 116.699L42.6884 116.12C43.0196 115.292 42.6057 114.919 42.1089 114.919C41.281 114.919 40.2876 116.327 40.2876 117.569C40.2876 118.107 40.5359 118.438 40.9499 118.438C41.488 118.438 41.9847 117.941 42.3987 117.196ZM38.1765 115.416H38.756L37.8039 117.983C37.7211 118.189 37.8453 118.438 38.0523 118.438C38.5904 118.438 39.4597 117.9 39.7494 117.196H39.5839C39.3355 117.444 38.8802 117.776 38.5076 117.858L39.3769 115.457H40.2462L40.3704 115.085H39.5011L39.8322 114.174H39.5011L38.8802 115.085L38.1351 115.168V115.416H38.1765ZM34.9063 117.403C34.9063 116.617 35.7756 115.54 36.2723 115.54C36.3965 115.54 36.4793 115.54 36.5621 115.582L36.0654 116.948C35.7756 117.32 35.3203 117.734 35.1133 117.734C34.9891 117.776 34.9063 117.651 34.9063 117.403ZM37.6383 114.754H37.3486L37.0588 115.044H36.976C35.4858 115.044 34.244 116.699 34.244 117.9C34.244 118.231 34.451 118.438 34.7821 118.438C35.1547 118.438 35.5272 117.9 35.9412 117.32V117.527C35.8998 118.107 36.0654 118.438 36.3965 118.438C36.7691 118.438 37.1002 117.858 37.3486 117.32H37.183C37.0174 117.569 36.8518 117.734 36.7277 117.734C36.6035 117.734 36.4793 117.486 36.7277 116.948L37.6383 114.754ZM34.4924 115.706C34.6166 115.292 34.5338 114.919 34.244 114.919C33.8715 114.919 33.7473 115.209 33.3747 116.037V115.54C33.3747 115.209 33.2505 114.878 32.9608 114.878C32.5882 114.878 32.2571 115.457 32.0087 115.996H32.1743C32.3399 115.747 32.5054 115.582 32.6296 115.582C32.7952 115.582 32.878 115.83 32.6296 116.368L31.9259 117.9C31.8017 118.189 31.9259 118.396 32.2157 118.396C32.3813 118.396 32.464 118.355 32.5468 118.148L33.2505 116.327C33.4575 116.078 33.6231 115.871 33.8301 115.664H34.4924V115.706ZM29.5664 118.272L29.6492 118.065C28.78 117.9 28.6972 117.9 29.0283 116.989L29.3595 116.037H30.3115C30.7255 116.037 30.7255 116.203 30.6841 116.658H30.9325L31.512 115.085H31.2636C31.0566 115.457 30.8911 115.706 30.4357 115.706H29.4837L29.9804 114.34C30.146 113.926 30.2288 113.802 30.8083 113.802H31.2222C31.8017 113.802 31.8845 113.967 31.8845 114.588H32.1329L32.3399 113.512H28.78L28.6972 113.719C29.4009 113.843 29.4423 113.926 29.1111 114.795L28.3246 116.906C27.9935 117.776 27.8693 117.858 27.0828 117.983L27.0414 118.189H29.5664V118.272ZM46.9934 107.344C47.2418 107.344 47.4488 107.51 47.3246 107.965L46.207 108.213C46.4139 107.717 46.7451 107.344 46.9934 107.344ZM47.6144 109.124H47.4074C47.1176 109.455 46.8279 109.704 46.5381 109.704C46.2484 109.704 46.0828 109.538 46.0828 109.124C46.0828 108.959 46.0828 108.793 46.1242 108.627L47.9041 108.048C48.2353 107.22 47.8213 106.847 47.3246 106.847C46.4967 106.847 45.5033 108.255 45.5033 109.497C45.5033 110.035 45.7516 110.366 46.1656 110.366C46.7037 110.366 47.2004 109.911 47.6144 109.124ZM47.2832 106.516L48.525 105.357V105.233H47.8627L47.0762 106.558H47.2832V106.516ZM43.4335 107.344H44.0131L43.061 109.911C42.9782 110.118 43.1024 110.366 43.3094 110.366C43.8475 110.366 44.7168 109.828 45.0065 109.124H44.8409C44.5926 109.373 44.1372 109.704 43.7647 109.786L44.634 107.386H45.5033L45.6274 107.013H44.7582L45.0893 106.102H44.7582L44.1372 107.013L43.3921 107.096V107.344H43.4335ZM42.6057 107.22C42.6884 106.972 42.5229 106.847 42.3987 106.847C41.9019 106.847 41.281 107.303 41.0327 107.965H41.1982C41.3638 107.717 41.6536 107.468 41.902 107.427L40.9085 109.993C40.8257 110.242 40.9913 110.366 41.1155 110.366C41.6122 110.366 42.1917 109.911 42.4401 109.248H42.2745C42.1089 109.497 41.8192 109.745 41.5708 109.786L42.6057 107.22ZM42.8126 105.937C43.061 105.937 43.2266 105.73 43.2266 105.523C43.2266 105.274 43.0196 105.109 42.8126 105.109C42.5643 105.109 42.3987 105.316 42.3987 105.523C42.3573 105.771 42.5643 105.937 42.8126 105.937ZM39.3769 109.786L41.1569 105.067L41.1155 104.985L39.9978 105.109V105.233L40.2048 105.399C40.4118 105.564 40.329 105.688 40.1634 106.185L38.756 109.869C38.6732 110.076 38.7974 110.325 39.0043 110.325C39.5011 110.325 40.0806 109.869 40.329 109.207H40.1634C39.9978 109.497 39.6253 109.745 39.3769 109.786ZM35.9412 109.372C35.9412 108.586 36.8105 107.51 37.3072 107.51C37.4314 107.51 37.5142 107.51 37.5969 107.551L37.1002 108.917C36.8105 109.29 36.3551 109.704 36.1481 109.704C36.024 109.704 35.9412 109.579 35.9412 109.372ZM38.6732 106.723H38.3834L38.0937 107.013H38.0109C36.5207 107.013 35.2789 108.669 35.2789 109.869C35.2789 110.2 35.4858 110.407 35.817 110.407C36.1895 110.407 36.5621 109.869 36.976 109.29V109.497C36.9346 110.076 37.1002 110.407 37.4314 110.407C37.8039 110.407 38.1351 109.828 38.3834 109.29H38.2179C38.0523 109.538 37.8867 109.704 37.7625 109.704C37.6383 109.704 37.5142 109.455 37.7625 108.917L38.6732 106.723ZM32.0915 110.987C32.0915 110.656 32.4227 110.449 32.878 110.242C33.0436 110.325 33.2505 110.407 33.5817 110.49C34.0784 110.656 34.244 110.697 34.244 110.863C34.244 111.194 33.7059 111.401 32.9608 111.401C32.3813 111.442 32.0915 111.318 32.0915 110.987ZM33.4161 108.917C33.2091 108.917 33.1264 108.752 33.1264 108.545C33.1264 107.965 33.4161 107.137 33.9128 107.137C34.1198 107.137 34.2026 107.303 34.2026 107.51C34.244 108.048 33.9128 108.917 33.4161 108.917ZM34.8235 110.656C34.8235 110.242 34.451 110.076 33.8715 109.911C33.3747 109.745 33.1264 109.704 33.1264 109.538C33.1264 109.414 33.2505 109.248 33.4575 109.124C34.2854 109.083 34.8649 108.338 34.8649 107.675C34.8649 107.551 34.8235 107.427 34.7821 107.303H35.4858L35.61 106.93H34.4924C34.3682 106.847 34.2026 106.806 34.037 106.806C33.1264 106.806 32.5468 107.593 32.5468 108.213C32.5468 108.71 32.8366 109 33.2505 109.083C32.8366 109.29 32.5882 109.497 32.5882 109.745C32.5882 109.911 32.6296 109.993 32.7538 110.076C31.8017 110.366 31.3878 110.697 31.3878 111.152C31.3878 111.608 31.9673 111.773 32.671 111.773C33.8301 111.856 34.8235 111.194 34.8235 110.656ZM30.3115 107.924C30.7255 107.924 30.7255 108.089 30.6841 108.545H30.9325L31.512 106.972H31.2636C31.0566 107.344 30.8911 107.593 30.4357 107.593H29.4837L29.939 106.309C30.1046 105.895 30.1874 105.813 30.7669 105.813H31.1808C31.7603 105.813 31.8431 105.978 31.8431 106.558H32.0915L32.2985 105.481H28.7386L28.6558 105.688C29.3595 105.813 29.4009 105.895 29.0697 106.765L28.2832 108.876C27.9521 109.745 27.8279 109.828 27.0414 109.952L27 110.159H30.9739L31.6776 109.041H31.4292C30.9739 109.455 30.3943 109.869 29.6078 109.869C28.573 109.869 28.6558 109.828 28.9869 108.876L29.3595 107.841H30.3115V107.924ZM30.8497 105.192L32.0915 104.322V104.198H31.3464L30.6427 105.192H30.8497ZM46.5795 99.2723C46.8279 99.2723 47.0348 99.4379 46.9107 99.8932L45.793 100.142C46 99.6448 46.3311 99.2723 46.5795 99.2723ZM47.2004 101.052H46.9934C46.7037 101.383 46.4139 101.632 46.1242 101.632C45.8344 101.632 45.6688 101.466 45.6688 101.052C45.6688 100.887 45.6688 100.721 45.7102 100.556L47.4902 99.976C47.8213 99.1481 47.4074 98.7756 46.9107 98.7756C46.0828 98.7756 45.0893 100.183 45.0893 101.425C45.0893 101.963 45.3377 102.294 45.7516 102.294C46.2897 102.294 46.7865 101.839 47.2004 101.052ZM46.8693 98.4444L48.1111 97.2854V97.1612H47.4488L46.6623 98.4858H46.8693V98.4444ZM43.1438 99.2723H43.5991L42.647 101.839C42.5643 102.046 42.6884 102.294 42.8954 102.294C43.4335 102.294 44.3028 101.756 44.5926 101.052H44.427C44.1786 101.301 43.7233 101.632 43.3508 101.715L44.22 99.3137H45.0893L45.2135 98.9411H44.3442L44.6754 98.0305H44.3442L43.7233 98.9411L43.1024 99.0239V99.2723H43.1438ZM42.6884 99.5621C42.8126 99.1481 42.7298 98.7756 42.4401 98.7756C42.0675 98.7756 41.9433 99.0653 41.5708 99.8932V99.3965C41.5708 99.0653 41.4466 98.7342 41.1569 98.7342C40.7843 98.7342 40.4531 99.3137 40.2048 99.8518H40.3704C40.5359 99.6034 40.7015 99.4379 40.8257 99.4379C40.9913 99.4379 41.0741 99.6862 40.8257 100.224L40.122 101.756C39.9978 102.046 40.122 102.253 40.4118 102.253C40.5773 102.253 40.6601 102.211 40.7429 102.004L41.4466 100.183C41.6536 99.9346 41.8192 99.7276 42.0261 99.5207H42.6884V99.5621ZM38.7146 99.2723C38.963 99.2723 39.1699 99.4379 39.0457 99.8932L37.9281 100.142C38.1351 99.6448 38.4662 99.2723 38.7146 99.2723ZM39.3355 101.052H39.1285C38.8388 101.383 38.549 101.632 38.2593 101.632C37.9695 101.632 37.8039 101.466 37.8039 101.052C37.8039 100.887 37.8039 100.721 37.8453 100.556L39.6253 99.976C39.9564 99.1481 39.5425 98.7756 39.0457 98.7756C38.2179 98.7756 37.2244 100.183 37.2244 101.425C37.2244 101.963 37.4728 102.294 37.8867 102.294C38.4248 102.294 38.9216 101.839 39.3355 101.052ZM34.9477 101.797C34.7821 101.797 34.5338 101.632 34.5338 101.508C34.5338 101.466 34.6166 101.259 34.6993 101.011L34.9891 100.224C35.2789 99.8518 35.7756 99.4793 36.024 99.4793C36.1895 99.4793 36.3137 99.5621 36.3137 99.8104C36.3551 100.514 35.6928 101.797 34.9477 101.797ZM37.0174 99.5207C37.0174 98.9825 36.8105 98.817 36.4793 98.817C36.024 98.817 35.61 99.3137 35.1961 99.8932L36.2723 97.0784L36.2309 96.9956L35.1133 97.1198V97.244L35.3203 97.4095C35.5272 97.5751 35.4444 97.7407 35.2789 98.196L34.1198 101.176C34.037 101.383 33.9128 101.673 33.9128 101.715C33.9128 102.004 34.3268 102.294 34.6993 102.294C35.5272 102.294 37.0174 100.721 37.0174 99.5207ZM33.4989 99.1481C33.5817 98.8997 33.4161 98.7756 33.2919 98.7756C32.7952 98.7756 32.1743 99.2309 31.9259 99.8932H32.0915C32.2571 99.6448 32.5468 99.3965 32.7952 99.3551L31.8017 101.922C31.719 102.17 31.8845 102.294 32.0087 102.294C32.5054 102.294 33.085 101.839 33.3333 101.176H33.1678C33.0022 101.425 32.7124 101.673 32.464 101.715L33.4989 99.1481ZM33.6645 97.8649C33.9128 97.8649 34.0784 97.6579 34.0784 97.4509C34.0784 97.2026 33.8715 97.037 33.6645 97.037C33.4161 97.037 33.2505 97.244 33.2505 97.4509C33.2505 97.6993 33.4161 97.8649 33.6645 97.8649ZM31.0566 97.4509H28.6972L28.6144 97.6579C29.3181 97.7821 29.3595 97.8649 29.0283 98.7342L28.2832 100.845C27.9521 101.715 27.8279 101.797 27.0414 101.922L27 102.128H30.6013L31.3878 100.762H31.098C30.6427 101.259 30.146 101.839 29.3595 101.839C28.78 101.839 28.6972 101.756 29.0283 100.845L29.7734 98.7342C30.1046 97.8649 30.2288 97.7821 31.0152 97.6579L31.0566 97.4509Z" fill="white"/> +<path d="M27.0415 78.161V69.6338H29.8563C30.8084 69.6338 31.5121 69.8822 32.0916 70.3375C32.6297 70.7928 32.9195 71.4137 32.9195 72.2002C32.9195 72.9867 32.6297 73.6076 32.0916 74.063C31.5535 74.5183 30.8084 74.7667 29.8563 74.7667H28.7801V78.2024H27.0415V78.161ZM29.8977 71.0826H28.7387V73.2351H29.8977C30.2703 73.2351 30.56 73.1523 30.767 72.9453C30.974 72.7384 31.0981 72.49 31.0981 72.1588C31.0981 71.8277 30.974 71.5793 30.767 71.3723C30.56 71.2068 30.2703 71.0826 29.8977 71.0826ZM34.2855 78.161V69.6338H36.8933C37.8454 69.6338 38.5905 69.8822 39.1286 70.3375C39.6668 70.7928 39.9565 71.4137 39.9565 72.2002C39.9565 72.697 39.8323 73.1523 39.584 73.5249C39.3356 73.8974 39.0045 74.1872 38.5905 74.3941L41.2811 78.161H39.2114L36.9347 74.7253H36.0241V78.161H34.2855ZM37.0175 71.0826H36.0241V73.2351H37.0175C37.3901 73.2351 37.6798 73.1523 37.8868 72.9453C38.0938 72.7384 38.1766 72.49 38.1766 72.1588C38.1766 71.8277 38.0938 71.5793 37.8868 71.3723C37.6798 71.2068 37.3901 71.0826 37.0175 71.0826ZM42.3574 78.161V69.6338H47.3247V71.124H44.096V73.1109H46.8694V74.6011H44.096V76.7536H47.3247V78.2438H42.3574V78.161ZM49.353 78.161V69.6338H51.5469L53.6166 73.1523L55.6864 69.6338H57.8803V78.2024H56.1417V72.0761L54.1962 75.222H52.9543L51.0502 72.0761V78.161H49.353V78.161ZM60.2397 78.161V69.6338H61.9783V78.2024H60.2397V78.161ZM64.3378 78.161V69.6338H69.3051V71.124H66.0763V73.1109H68.8497V74.6011H66.0763V76.7536H69.3051V78.2438H64.3378V78.161ZM71.3334 78.161V69.6338H73.9412C74.8933 69.6338 75.6384 69.8822 76.1765 70.3375C76.7147 70.7928 77.0044 71.4137 77.0044 72.2002C77.0044 72.697 76.8802 73.1523 76.6319 73.5249C76.3835 73.8974 76.0524 74.1872 75.6384 74.3941L78.329 78.161H76.2593L73.9826 74.7253H73.072V78.161H71.3334ZM74.0654 71.0826H73.072V73.2351H74.0654C74.438 73.2351 74.7277 73.1523 74.9347 72.9453C75.1417 72.7384 75.2245 72.49 75.2245 72.1588C75.2245 71.8277 75.1417 71.5793 74.9347 71.3723C74.7277 71.2068 74.438 71.0826 74.0654 71.0826ZM27.0415 91.076V82.5074H29.2354L31.3051 86.0259L33.3748 82.5074H35.5687V91.076H33.8302V84.9911L31.926 88.137H30.7256L28.8215 84.9911V91.076H27.0415ZM37.8868 91.076V82.5074H39.6254V91.076H37.8868ZM42.0262 91.076V82.5074H44.2615L48.0698 88.6338V82.5074H49.8084V91.076H47.5731L43.7648 84.9497V91.076H42.0262ZM52.2092 91.076V82.5074H53.9478V91.076H52.2092ZM55.5622 89.917L56.804 88.758C57.0524 89.0891 57.3421 89.3375 57.6733 89.5444C58.0044 89.7514 58.3356 89.8342 58.7081 89.8342C59.0393 89.8342 59.3291 89.7514 59.4946 89.5858C59.7016 89.4203 59.7844 89.1719 59.7844 88.8407C59.7844 88.4682 59.5774 88.1784 59.1635 87.9715C58.7495 87.7645 58.2942 87.5575 57.8389 87.3092C57.3421 87.0608 56.8868 86.771 56.5142 86.3985C56.1417 86.0259 55.8933 85.4878 55.8933 84.7841C55.8933 84.4529 55.9761 84.1218 56.1003 83.832C56.2245 83.5423 56.4315 83.2525 56.6798 83.0455C56.9282 82.8386 57.218 82.6316 57.5491 82.5074C57.8803 82.3832 58.2528 82.3004 58.6668 82.3004C59.2877 82.3004 59.8672 82.4246 60.3639 82.7144C60.8607 82.9628 61.2746 83.3353 61.6471 83.7492L60.3639 84.8669C60.1156 84.5357 59.8258 84.2874 59.5774 84.0804C59.2877 83.8734 58.9979 83.7906 58.6668 83.7906C58.377 83.7906 58.1286 83.8734 57.963 84.039C57.7975 84.2046 57.7147 84.4116 57.7147 84.6599C57.7147 85.0325 57.9217 85.3222 58.3356 85.5292C58.7495 85.7362 59.2049 85.9431 59.6602 86.1915C60.1569 86.4399 60.6123 86.7296 60.9848 87.1022C61.3988 87.4747 61.6057 88.0129 61.6057 88.758C61.6057 89.1719 61.523 89.5031 61.3574 89.8342C61.1918 90.1654 60.9848 90.4137 60.7365 90.6207C60.4881 90.8277 60.1983 90.9933 59.8258 91.1174C59.4946 91.2416 59.1221 91.283 58.7081 91.283C58.0044 91.283 57.3835 91.1588 56.8454 90.9105C56.3901 90.7035 55.9347 90.3309 55.5622 89.917ZM62.4336 84.1218V82.5488H69.4293V84.1218H66.78V91.076H65.0415V84.1218H62.4336ZM71.0023 91.076V82.5074H73.6101C74.5622 82.5074 75.3073 82.7558 75.8454 83.2111C76.3835 83.6665 76.6733 84.2874 76.6733 85.0739C76.6733 85.5706 76.5491 86.0259 76.3007 86.3985C76.0524 86.771 75.7212 87.0608 75.3073 87.2678L77.9979 91.0346H75.9282L73.6515 87.5989H72.7408V91.0346H71.0023V91.076ZM73.6929 83.9976H72.6994V86.1501H73.6929C74.0654 86.1501 74.3552 86.0673 74.5622 85.8604C74.7691 85.6534 74.8519 85.405 74.8519 85.0739C74.8519 84.7427 74.7691 84.4943 74.5622 84.2874C74.3552 84.1218 74.0654 83.9976 73.6929 83.9976ZM79.0328 91.076V82.5074H84.0001V83.9976H80.7713V85.9845H83.5447V87.4747H80.7713V89.6272H84.0001V91.1174H79.0328V91.076Z" fill="white"/> +<path d="M40.3705 62.3487C40.4947 62.2245 40.6188 62.1003 40.743 61.9347C40.9914 61.6864 41.1984 61.3966 41.4881 61.1896C41.5709 61.1069 41.6537 61.0655 41.7365 60.9827C41.7779 60.9413 41.7779 60.8999 41.7779 60.8999C41.6537 60.9413 41.6123 61.0241 41.4881 61.0655C41.4467 61.0655 41.4467 61.0241 41.4467 61.0241C41.5295 60.9827 41.6123 60.8999 41.6951 60.8585C41.6537 60.8585 41.6537 60.8171 41.6537 60.8171C41.3639 60.8171 41.157 60.9827 40.95 61.1896C40.9086 61.231 40.8672 61.1483 40.8258 61.1483C40.4947 61.2724 40.2463 61.5622 39.9151 61.6864V61.645C39.7909 61.6864 39.6668 61.7692 39.5012 61.8106C39.2942 61.852 39.1286 61.852 38.9631 61.852C38.7147 61.8933 38.4249 61.9347 38.1766 61.9761C38.1766 61.9761 38.1766 61.9761 38.1352 61.9761C38.011 62.0175 37.8454 62.0589 37.7212 62.1417L37.6798 62.1831C37.6384 62.2245 37.5971 62.2659 37.5143 62.3073C37.3901 62.3901 37.2659 62.5143 37.1417 62.5971H37.1003C36.9761 62.7212 36.852 62.8454 36.7278 62.9282C36.7278 62.9282 36.6864 62.9282 36.645 62.9282C36.645 62.9282 36.645 62.9282 36.645 62.8868C36.645 62.8454 36.6864 62.804 36.6864 62.804C36.7278 62.7626 36.7278 62.7212 36.7692 62.7212C36.8106 62.6798 36.8106 62.6384 36.852 62.5971V62.5557C36.852 62.5557 36.852 62.5557 36.8106 62.5557C36.9347 62.4315 37.0589 62.3487 37.1831 62.2659C37.1831 62.2659 37.1417 62.2659 37.1417 62.2245L37.1831 62.1831C37.2245 62.1831 37.1831 62.2245 37.1831 62.2245C37.1417 62.2659 37.1003 62.3901 37.0175 62.3487H36.9761C36.9761 62.3487 36.9761 62.3487 36.9347 62.3487C36.9347 62.3487 36.9347 62.3487 36.9347 62.3073C36.9347 62.3073 36.9347 62.2659 36.9761 62.2659C36.9761 62.2659 36.9761 62.2659 36.9761 62.2245C36.9761 62.2245 36.9761 62.1831 37.0175 62.1831V62.1417C37.0589 62.1003 37.1003 62.0589 37.1831 62.0175C37.2659 61.9761 37.3487 61.9347 37.4315 61.8933L37.4729 61.852C37.3487 61.8933 37.2245 61.9347 37.1003 62.0175H37.0589H37.0175C37.0589 61.9761 37.1003 61.9347 37.1417 61.8933C37.1831 61.8933 37.1831 61.8933 37.1831 61.9347C37.8868 61.3966 38.8803 61.5208 39.7082 61.231C39.7909 61.1896 39.8323 61.1482 39.9151 61.1069C40.0393 61.0655 40.1221 60.9413 40.2463 60.8999C40.4119 60.7757 40.536 60.6101 40.6188 60.4032C40.6188 60.3618 40.5774 60.3618 40.5774 60.3618C40.2877 60.6929 39.9565 60.8999 39.584 61.1069C39.1286 61.3552 38.5905 61.3138 38.1352 61.3552C38.1766 61.3138 38.218 61.3138 38.2594 61.3138C38.2594 61.231 38.3008 61.231 38.3421 61.1896H38.4249C38.4663 61.1896 38.4663 61.1483 38.4663 61.1483C38.5077 61.1483 38.5905 61.1069 38.5491 61.1069C38.4663 61.0241 38.3421 61.1896 38.218 61.1069C38.2594 61.0655 38.2594 60.9827 38.3008 60.9827H38.3835C38.3835 60.9413 38.4249 60.8999 38.4249 60.8999C38.7561 60.6929 39.0872 60.5273 39.377 60.3618C39.2942 60.3618 39.2528 60.4445 39.2114 60.4032C39.2528 60.4032 39.2114 60.3204 39.2528 60.3204C39.5012 60.2376 39.7082 60.1134 39.9565 60.0306C39.8737 60.0306 39.7909 60.1134 39.7082 60.0306C39.7496 59.9892 39.7909 59.9478 39.8323 59.9478V59.865C39.8323 59.8236 39.8737 59.8236 39.8737 59.8236C39.8323 59.8236 39.8323 59.7822 39.8323 59.7822C39.8737 59.7408 39.9151 59.7408 39.9565 59.6995C39.9151 59.6995 39.8737 59.6994 39.8737 59.6581C39.9565 59.5753 40.0393 59.5339 40.1635 59.5339C40.1221 59.4925 40.0807 59.5339 40.0807 59.4925C40.0807 59.4511 40.1221 59.4511 40.1221 59.4511V59.4511C40.0807 59.4097 40.0807 59.3683 40.0807 59.3683C40.2049 59.2027 40.2049 58.9957 40.2877 58.8302C40.2463 58.8302 40.2463 58.8302 40.2463 58.7888C40.0393 59.0371 39.6668 59.1199 39.3356 59.2027H39.2114C39.0872 59.2441 38.9631 59.2441 38.8389 59.1613C38.7561 59.1199 38.7147 59.0371 38.6319 58.9957C38.4663 58.8716 38.2594 58.7888 38.0938 58.7474C37.5143 58.5818 36.9347 58.499 36.3966 58.499C36.645 58.3748 36.8933 58.3748 37.1831 58.292C37.5557 58.1679 37.9282 58.0437 38.3008 58.0851C38.218 58.0437 38.1352 58.0851 38.0938 58.0851C37.7626 58.0437 37.4729 58.1679 37.1417 58.2093C36.9347 58.2506 36.7278 58.3334 36.4794 58.3748C36.3552 58.4162 36.2724 58.5404 36.1069 58.5404V58.4576C36.3138 58.2093 36.6036 57.9195 36.9347 57.9195C37.3487 57.8367 37.7212 57.9195 38.0938 57.9609C38.3835 58.0023 38.6319 58.0437 38.9217 58.1265C39.0459 58.1265 39.0459 58.292 39.1286 58.3334C39.2528 58.3748 39.377 58.3334 39.5426 58.4162C39.5426 58.3748 39.5012 58.3334 39.5426 58.292C39.6254 58.2093 39.7496 58.3334 39.8323 58.2506C39.9979 58.1265 39.6668 57.9609 39.584 57.7953C39.584 57.7539 39.6254 57.7539 39.6254 57.7539C39.7909 57.9195 39.9151 58.0851 40.1635 58.2093C40.2877 58.2506 40.536 58.3334 40.4947 58.1679C40.3705 57.9195 40.1635 57.7125 39.9979 57.5056V57.4228C39.9565 57.4228 39.9565 57.3814 39.9151 57.3814V57.2572C39.8323 57.2158 39.8323 57.133 39.7909 57.0502C39.7082 56.926 39.7496 56.8018 39.7082 56.6363C39.7082 56.5535 39.7082 56.4293 39.6668 56.3051C39.584 55.9326 39.5012 55.6014 39.4598 55.2289C39.4184 54.8149 39.7082 54.4838 39.9151 54.1112C40.0807 53.8629 40.2463 53.5731 40.536 53.4075C40.6188 53.1592 40.7844 52.9108 40.95 52.7038C41.1156 52.4968 41.4053 52.3727 41.6537 52.2485C41.9435 52.1243 42.2332 52.0415 42.2332 52.0415H27.0415V63.7561H37.804C38.218 63.4663 38.6319 63.3008 39.2528 63.011C39.5012 62.8868 40.1635 62.5971 40.3705 62.3487ZM36.9347 60.7757C36.8933 60.7757 36.8106 60.8171 36.8106 60.7343C36.852 60.6101 36.9761 60.6101 37.0589 60.5687C37.1003 60.5273 37.1831 60.4859 37.2245 60.5273C37.2659 60.6101 37.3487 60.5687 37.3901 60.6101C37.2659 60.7757 37.1003 60.7343 36.9347 60.7757ZM33.5404 60.279L33.499 60.2376C33.7888 59.865 33.9957 59.4925 34.2027 59.1199C34.4925 58.9544 34.7408 58.7474 34.9478 58.499C35.3204 58.0851 35.7343 57.7539 36.1896 57.5056C36.3552 57.4228 36.6036 57.4642 36.7692 57.5469C36.6864 57.6297 36.6036 57.6297 36.5208 57.6711C36.4794 57.6711 36.4794 57.6711 36.438 57.6297C36.4794 57.5883 36.4794 57.5883 36.4794 57.5469C36.2724 57.7953 35.9413 57.9195 35.7757 58.2093C35.6515 58.4162 35.5687 58.706 35.279 58.7888C35.1962 58.8302 35.3204 58.706 35.2376 58.7474C34.5753 59.2027 34.0785 59.6994 33.5404 60.279ZM35.4032 58.8302C35.3618 58.8716 35.3618 58.8716 35.3204 58.913C35.279 58.9544 35.279 58.9957 35.2376 58.9957C35.1962 58.9957 35.1962 58.9957 35.1962 58.9544C35.2376 58.8716 35.279 58.7888 35.3618 58.7474C35.4032 58.7888 35.4032 58.7888 35.4032 58.8302ZM36.438 62.1417C36.438 62.1831 36.3966 62.1831 36.3966 62.2245C36.438 62.2245 36.438 62.2245 36.438 62.2659C36.3966 62.3073 36.3552 62.3487 36.2724 62.3901C36.2724 62.3901 36.2724 62.3901 36.231 62.3901C36.1896 62.4315 36.1896 62.4315 36.1483 62.4729C36.1069 62.5143 35.9827 62.4729 36.0241 62.4315C36.0655 62.3901 36.1483 62.3073 36.1896 62.2659C36.231 62.2245 36.2724 62.2245 36.2724 62.1831L36.3138 62.1417C36.3138 62.1003 36.438 62.1003 36.438 62.1417ZM36.0241 61.9761C35.9413 62.0589 35.8585 62.1003 35.7757 62.1417C35.6929 62.1831 35.5687 62.2245 35.4859 62.2659H35.4445C35.3618 62.3073 35.279 62.3901 35.2376 62.4315C35.2376 62.4315 35.2376 62.4315 35.1962 62.4729L35.1548 62.5143L35.1134 62.5557C35.1134 62.5557 35.1134 62.5971 35.072 62.5971H35.0306H34.9892H34.9478C34.9064 62.6384 34.9064 62.6384 34.865 62.6798C34.8236 62.7212 34.7822 62.7626 34.7408 62.804C34.7408 62.804 34.7408 62.804 34.7408 62.8454V62.804C34.7822 62.7626 34.7822 62.7626 34.8236 62.7212C34.8236 62.7212 34.8236 62.7212 34.865 62.6798L34.9064 62.6384C34.9478 62.5971 34.9478 62.5557 34.9892 62.5557L35.0306 62.5143C35.0306 62.5143 35.0306 62.4729 35.072 62.4729C35.072 62.4729 35.072 62.4315 35.1134 62.4315C35.1134 62.4315 35.1134 62.4315 35.1134 62.3901V62.3487C35.1548 62.3073 35.1548 62.2659 35.1962 62.2245C35.1548 62.2245 35.1548 62.2659 35.1134 62.3073C35.072 62.3073 35.0306 62.3073 35.072 62.2659L35.1134 62.2245C35.1548 62.1831 35.1962 62.1417 35.2376 62.1003C35.279 62.1003 35.279 62.0589 35.3204 62.0589L35.3618 62.0175C35.5687 61.8106 35.9413 61.8106 36.231 61.6864C36.3552 61.645 36.4794 61.7278 36.6036 61.6864C36.6864 61.6864 36.7278 61.6864 36.8106 61.7278C36.3966 61.7278 36.231 61.852 36.0241 61.9761ZM36.4794 60.4445C36.438 60.4032 36.5622 60.4445 36.5622 60.4032H36.3966C36.3552 60.4032 36.3552 60.3618 36.3552 60.3618C36.231 60.4032 36.1069 60.4445 35.9827 60.4445C35.8171 60.4859 35.6929 60.6101 35.5273 60.6515C35.279 60.7343 35.072 60.9413 34.8236 61.0241C34.7822 61.0241 34.7822 60.9827 34.7822 60.9827C34.8236 60.8999 34.9064 60.8999 34.9478 60.8171C34.9478 60.7757 34.9478 60.7757 34.9064 60.7757C35.072 60.5273 35.3204 60.4032 35.5687 60.1962V60.1134C35.6515 60.0306 35.7343 59.9892 35.7757 59.865C35.8171 59.7822 35.8999 59.6994 35.9827 59.6581C35.9413 59.6167 35.8999 59.6167 35.8999 59.5753C35.8171 59.5753 35.7343 59.6167 35.6515 59.5339C35.6929 59.4925 35.7343 59.4511 35.7757 59.4511C35.7757 59.4511 35.7343 59.4511 35.7343 59.4097C35.6929 59.3683 35.7757 59.3269 35.8585 59.2855C35.9413 59.2441 36.0655 59.2441 36.1069 59.2027C35.9413 59.1613 35.7757 59.2441 35.6101 59.1613C35.7343 58.8716 35.8999 58.6232 36.1483 58.499C36.1896 58.499 36.231 58.499 36.231 58.5404C36.231 58.6646 36.1483 58.7474 36.0655 58.7474C36.231 58.7888 36.438 58.7888 36.6036 58.8716C36.5622 58.913 36.5208 58.913 36.5208 58.913C36.645 58.9957 36.7692 58.9544 36.8933 59.0371C36.8106 59.1199 36.7692 59.0371 36.6864 59.0371C37.3901 59.2441 38.0938 59.4097 38.6733 59.8236C38.1766 60.072 37.6798 60.1962 37.1417 60.279C37.0589 60.279 37.0175 60.279 36.9761 60.2376C36.9761 60.279 36.9761 60.3204 36.9347 60.3204C36.852 60.3204 36.7692 60.3204 36.7278 60.3618C36.6864 60.4859 36.5622 60.4859 36.4794 60.4445Z" fill="white"/> +<path d="M59.2877 52H46.6625C46.6625 52 46.7039 52 46.7867 52.0414C46.8695 52.0828 47.035 52.1656 47.1178 52.207C47.2834 52.2898 47.449 52.4139 47.5318 52.5795C47.5732 52.6623 47.6559 52.7865 47.6146 52.8693C47.5732 52.9935 47.5318 53.159 47.449 53.2004C47.3248 53.2832 47.1592 53.2832 46.9936 53.2418C46.9108 53.2418 46.8281 53.2004 46.7453 53.2004C47.0764 53.3246 47.4076 53.4902 47.6146 53.78C47.6559 53.8213 47.7387 53.8627 47.8215 53.8627C47.8629 53.8627 47.8629 53.9041 47.8629 53.9455C47.8215 53.9869 47.7801 54.0283 47.7801 54.0697H47.8629C47.9871 54.0283 47.9457 53.8213 48.1113 53.8627C48.2355 53.9455 48.2769 54.0697 48.1941 54.1939C48.1113 54.2767 48.0285 54.3595 47.9457 54.4009C47.9043 54.4423 47.9043 54.5251 47.9457 54.5664C48.0285 54.6492 48.0285 54.732 48.0699 54.8148C48.1527 54.9804 48.1527 55.146 48.2355 55.3115C48.3183 55.6427 48.401 55.9739 48.401 56.305C48.401 56.4706 48.3183 56.6362 48.3596 56.8017C48.401 56.9673 48.5252 57.1329 48.608 57.2571C48.6908 57.3813 48.7736 57.464 48.8564 57.6296C48.9806 57.8366 49.2289 58.085 49.1047 58.3333C49.022 58.4989 48.7736 58.4575 48.6494 58.5403C48.5252 58.6645 48.608 58.8301 48.6908 58.9542C48.815 59.1612 48.5666 59.2854 48.401 59.3682C48.4424 59.451 48.5252 59.4096 48.5666 59.451C48.608 59.5752 48.6908 59.6166 48.6494 59.7407C48.5666 59.8649 48.2769 59.9477 48.4424 60.1547C48.5252 60.3203 48.4838 60.4858 48.401 60.6514C48.3183 60.8584 48.1527 60.9412 47.9871 60.9826C47.8629 61.024 47.6973 61.024 47.5732 61.024C47.4076 60.9826 47.3662 60.9826 47.3248 60.9826C46.9522 60.9412 46.5797 60.817 46.2071 60.817C46.083 60.8584 46.0002 60.8584 45.9174 60.8998C45.8346 60.9826 45.7104 61.0654 45.669 61.1481L45.6276 61.1895C45.6276 61.1895 45.6276 61.2309 45.5862 61.2309C45.5862 61.2309 45.5862 61.2309 45.5862 61.2723C45.5034 61.3551 45.462 61.4379 45.4207 61.5207V61.5621C45.3379 61.6863 45.2965 61.8518 45.2551 61.976C45.0895 62.4728 45.1723 62.9281 45.2965 63.0109C45.3379 63.0523 46.0416 63.2593 46.4969 63.4662C46.7453 63.549 46.8695 63.6318 47.035 63.7146H59.4119V52H59.2877Z" fill="white"/> +<path d="M47.4074 56.3051C47.4902 56.3465 47.6144 56.3465 47.6144 56.3879C47.573 56.5534 47.3246 56.5948 47.159 56.8018H47.0762C46.9934 56.8432 47.0348 56.9674 46.9521 56.9674C46.8693 56.926 46.8279 56.9674 46.7451 57.0088C46.8279 57.0916 46.9521 57.1743 47.0762 57.1329C47.1176 57.1329 47.159 57.1743 47.159 57.2157C47.159 57.2157 47.2004 57.2157 47.2004 57.1743C47.2418 57.1743 47.2418 57.1743 47.2418 57.2157V57.2571C47.159 57.3399 47.0762 57.2985 46.9934 57.3399C47.159 57.3813 47.366 57.3813 47.4902 57.3399C47.6144 57.2985 47.4902 57.0916 47.573 56.9674C47.5316 56.9674 47.573 56.8846 47.5316 56.8846C47.573 56.8432 47.6144 56.7604 47.6558 56.7604C47.6971 56.7604 47.7799 56.719 47.7799 56.6776C47.7799 56.6362 47.6972 56.5948 47.6972 56.5534C47.8213 56.4706 47.9455 56.3465 47.9041 56.1809C47.8627 56.0981 47.6972 56.0981 47.573 56.0567C47.4488 56.0153 47.3246 56.0567 47.2004 56.0981C47.0762 56.0981 46.9934 56.1809 46.8693 56.1809C46.7037 56.2223 46.5795 56.3051 46.4553 56.3879C46.6209 56.3051 46.7865 56.3051 46.9521 56.2637C47.159 56.3051 47.2832 56.2637 47.4074 56.3051Z" fill="white"/> +<g clip-path="url(#clip0_12297_72121)"> +<path d="M150.811 82.9966H148.78V89.1683H147.281V82.9966H145.284V81.5618H150.811V82.9966ZM156.337 87.7336V89.1683H151.747V81.577H156.341V83.0118H153.227V84.6287H156.071V86.0445H153.227V87.7488L156.337 87.7336ZM160.144 86.5266H159.02V89.1835H157.521V81.5922H160.519C160.846 81.5912 161.171 81.6556 161.474 81.7818C161.777 81.908 162.052 82.0934 162.284 82.3275C162.516 82.5615 162.701 82.8397 162.826 83.146C162.952 83.4523 163.017 83.7807 163.018 84.1125C163.009 84.5834 162.868 85.0419 162.611 85.4345C162.354 85.8271 161.992 86.1374 161.568 86.3292L163.231 89.1987H161.632L160.144 86.5266ZM159.02 85.2133H160.545C160.81 85.1718 161.052 85.0356 161.227 84.8292C161.402 84.6228 161.498 84.3598 161.498 84.0878C161.498 83.8159 161.402 83.5529 161.227 83.3465C161.052 83.1401 160.81 83.0038 160.545 82.9624H159.02V85.2133ZM166.843 86.5266H165.719V89.1835H164.239V81.5922H167.237C167.893 81.5911 168.522 81.8519 168.989 82.318C169.456 82.7841 169.723 83.418 169.732 84.0822C169.724 84.5531 169.583 85.0119 169.326 85.4045C169.069 85.7972 168.707 86.1074 168.282 86.2988L169.946 89.1683H168.35L166.843 86.5266ZM165.719 85.2133H167.244C167.51 85.1718 167.752 85.0356 167.926 84.8292C168.101 84.6228 168.197 84.3598 168.197 84.0878C168.197 83.8159 168.101 83.5529 167.926 83.3465C167.752 83.1401 167.51 83.0038 167.244 82.9624H165.719V85.2133ZM172.415 89.1683H170.916V81.577H172.415V89.1683ZM178.886 82.9966H176.851V89.1683H175.371V82.9966H173.352V81.5618H178.878L178.886 82.9966ZM179.047 85.3651C179.046 84.5822 179.275 83.8167 179.704 83.1655C180.133 82.5144 180.743 82.0069 181.457 81.7073C182.171 81.4077 182.957 81.3295 183.715 81.4826C184.473 81.6357 185.169 82.0132 185.715 82.5673C186.261 83.1214 186.632 83.8272 186.782 84.5953C186.931 85.3634 186.853 86.1592 186.555 86.8819C186.258 87.6046 185.756 88.2217 185.113 88.6551C184.469 89.0885 183.713 89.3186 182.94 89.3164C182.426 89.3204 181.917 89.2207 181.441 89.0231C180.966 88.8254 180.534 88.5338 180.172 88.1652C179.809 87.7966 179.522 87.3585 179.329 86.8764C179.135 86.3943 179.038 85.878 179.043 85.3575L179.047 85.3651ZM185.364 85.3575C185.358 84.8733 185.21 84.4019 184.939 84.0026C184.669 83.6032 184.288 83.2938 183.845 83.1131C183.401 82.9325 182.915 82.8887 182.447 82.9873C181.979 83.0859 181.55 83.3224 181.214 83.6672C180.879 84.012 180.651 84.4496 180.56 84.925C180.469 85.4004 180.519 85.8924 180.704 86.3392C180.888 86.7859 181.199 87.1675 181.597 87.4358C181.995 87.7042 182.462 87.8474 182.94 87.8475C183.263 87.8538 183.584 87.7935 183.883 87.6702C184.182 87.5469 184.453 87.3631 184.68 87.1302C184.907 86.8972 185.085 86.6199 185.202 86.3151C185.32 86.0104 185.375 85.6845 185.364 85.3575V85.3575ZM189.486 89.1532H188.006V81.5618H189.486V89.1532ZM193.607 86.4962H192.483V89.1532H190.985V81.5618H193.982C194.31 81.5603 194.634 81.6244 194.938 81.7504C195.241 81.8764 195.516 82.0618 195.749 82.296C195.981 82.5302 196.165 82.8085 196.291 83.115C196.417 83.4216 196.481 83.7502 196.481 84.0822C196.473 84.5527 196.333 85.0112 196.077 85.4038C195.821 85.7964 195.459 86.1069 195.035 86.2988L196.71 89.1683H195.099L193.607 86.4962ZM192.483 85.1829H194.008C194.274 85.1415 194.516 85.0052 194.69 84.7988C194.865 84.5924 194.961 84.3294 194.961 84.0575C194.961 83.7855 194.865 83.5226 194.69 83.3161C194.516 83.1097 194.274 82.9735 194.008 82.9321H192.483V85.1829ZM202.293 87.7032V89.138H197.677V81.5466H202.266V82.9814H199.157V84.5984H202V86.0141H199.157V87.7184L202.293 87.7032ZM203.109 87.411L204.376 86.6518C204.486 87.0161 204.713 87.3326 205.022 87.5507C205.33 87.7688 205.702 87.8759 206.077 87.855C206.969 87.855 207.28 87.4755 207.28 87.0504C207.28 86.4848 206.774 86.2685 205.657 85.942C204.541 85.6156 203.409 85.1146 203.409 83.6646C203.409 82.2147 204.59 81.3872 205.878 81.3872C206.442 81.3722 206.997 81.5264 207.475 81.8303C207.952 82.1342 208.33 82.5743 208.561 83.0953L207.317 83.824C207.203 83.531 207.002 83.2811 206.742 83.109C206.481 82.937 206.174 82.8512 205.863 82.8637C205.241 82.8637 204.874 83.1902 204.874 83.6229C204.874 84.0556 205.167 84.3403 206.302 84.6857C207.493 85.0652 208.76 85.4714 208.76 87.0238C208.76 88.4472 207.636 89.3202 206.036 89.3202C204.5 89.3202 203.492 88.561 203.083 87.4223" fill="white"/> +<path d="M196.579 70.6873V78.1837H196.05V76.9425C195.835 77.3624 195.507 77.7128 195.105 77.9543C194.704 78.1957 194.243 78.3186 193.776 78.309C193.045 78.309 192.343 78.0146 191.826 77.4907C191.309 76.9668 191.018 76.2563 191.018 75.5154C191.018 74.7744 191.309 74.0639 191.826 73.54C192.343 73.0161 193.045 72.7217 193.776 72.7217C194.242 72.7114 194.702 72.8332 195.104 73.0732C195.506 73.3133 195.834 73.6622 196.05 74.0806V70.6873H196.579ZM196.05 75.5078C196.05 75.0573 195.918 74.617 195.671 74.2425C195.424 73.868 195.073 73.5761 194.662 73.4037C194.252 73.2314 193.8 73.1863 193.364 73.2741C192.927 73.362 192.527 73.5789 192.212 73.8974C191.898 74.2159 191.684 74.6217 191.597 75.0635C191.51 75.5052 191.555 75.9632 191.725 76.3793C191.895 76.7954 192.183 77.1511 192.553 77.4014C192.923 77.6516 193.358 77.7852 193.802 77.7852C194.098 77.7887 194.392 77.7323 194.667 77.6191C194.941 77.5059 195.19 77.3383 195.4 77.1261C195.609 76.9139 195.775 76.6614 195.886 76.3835C195.998 76.1056 196.054 75.8078 196.05 75.5078ZM203.544 75.5267C203.544 75.614 203.544 75.7013 203.544 75.7849H198.767C198.811 76.3494 199.07 76.8743 199.49 77.2484C199.91 77.6225 200.457 77.8164 201.015 77.789C201.378 77.8087 201.74 77.7284 202.062 77.5566C202.384 77.3849 202.654 77.1281 202.843 76.8135L203.308 77.0906C203.061 77.4801 202.718 77.7975 202.312 78.0112C201.907 78.2249 201.453 78.3276 200.996 78.309C200.628 78.326 200.259 78.2654 199.915 78.131C199.571 77.9966 199.258 77.7912 198.996 77.528C198.734 77.2647 198.528 76.9492 198.393 76.6015C198.257 76.2538 198.195 75.8813 198.208 75.5078C198.196 75.139 198.257 74.7714 198.39 74.4278C198.523 74.0842 198.724 73.7718 198.981 73.51C199.237 73.2482 199.544 73.0425 199.883 72.9056C200.221 72.7687 200.583 72.7035 200.947 72.7142C202.551 72.7142 203.57 74.0616 203.57 75.5267H203.544ZM198.774 75.2611H203.023C203.011 74.716 202.789 74.1974 202.403 73.8169C202.018 73.4365 201.501 73.2245 200.962 73.2266C200.405 73.2079 199.862 73.4119 199.452 73.7946C199.041 74.1772 198.795 74.7079 198.767 75.2724L198.774 75.2611ZM208.674 76.7907C208.674 77.6713 207.924 78.309 206.781 78.309C205.725 78.309 205.028 77.8041 204.777 77.1209L205.23 76.8514C205.421 77.4322 205.98 77.7966 206.781 77.7966C207.583 77.7966 208.145 77.4625 208.145 76.7869C208.145 75.3332 204.945 76.1682 204.945 74.24C204.945 73.3936 205.661 72.7217 206.74 72.7217C207.111 72.6995 207.48 72.7893 207.8 72.9799C208.12 73.1705 208.377 73.4532 208.539 73.7921L208.093 74.0464C207.975 73.7879 207.783 73.5717 207.542 73.4265C207.3 73.2814 207.02 73.2143 206.74 73.2342C206.054 73.2342 205.474 73.6137 205.474 74.24C205.474 75.6748 208.674 74.8283 208.674 76.7869V76.7907ZM151.208 76.1454C151.209 76.4134 151.157 76.6789 151.057 76.9266C150.956 77.1744 150.808 77.3995 150.621 77.589C150.434 77.7784 150.211 77.9285 149.967 78.0306C149.722 78.1327 149.46 78.1847 149.196 78.1837H146.011V70.7176H148.952C149.466 70.7186 149.96 70.9261 150.323 71.2946C150.687 71.6631 150.892 72.1626 150.893 72.6838C150.898 73.0182 150.812 73.3475 150.645 73.6359C150.477 73.9244 150.235 74.1609 149.945 74.3197C150.316 74.4586 150.635 74.7091 150.861 75.0375C151.087 75.366 151.208 75.7566 151.208 76.1568V76.1454ZM146.569 71.2414V74.1034H148.952C149.327 74.1034 149.686 73.9526 149.951 73.6843C150.216 73.4159 150.365 73.0519 150.365 72.6724C150.365 72.2929 150.216 71.9289 149.951 71.6606C149.686 71.3922 149.327 71.2414 148.952 71.2414H146.569ZM150.649 76.1454C150.653 75.9488 150.619 75.7533 150.548 75.5702C150.477 75.3872 150.37 75.2202 150.235 75.079C150.1 74.9378 149.938 74.8252 149.76 74.7476C149.582 74.6701 149.39 74.6291 149.196 74.6272H146.573V77.6409H149.196C149.39 77.6385 149.581 77.5972 149.759 77.5194C149.938 77.4417 150.099 77.329 150.234 77.188C150.369 77.0469 150.475 76.8801 150.547 76.6973C150.618 76.5145 150.653 76.3192 150.649 76.1227V76.1454ZM157.042 76.2593H153.34L152.62 78.1571H152.032L154.898 70.7176H155.494L158.353 78.1951H157.742L157.042 76.2593ZM156.839 75.7279L155.194 71.4009L153.549 75.7507L156.839 75.7279ZM165.045 70.7176V78.1951H164.55L160.193 71.7539V78.1837H159.634V70.7176H160.121L164.487 77.1703V70.7176H165.045ZM175.802 75.6862V70.7176H176.36V75.6862C176.36 76.9046 177.11 77.7586 178.504 77.7586C179.898 77.7586 180.654 76.9046 180.654 75.6862V70.7176H181.213V75.6862C181.213 77.2652 180.126 78.3014 178.504 78.3014C176.881 78.3014 175.802 77.2652 175.802 75.6862V75.6862ZM187.343 77.6523V78.1837H183.146V70.7176H187.343V71.2528H183.704V74.1337H187.077V74.6689H183.704V77.6409L187.343 77.6523ZM174.277 74.445C174.276 73.6821 174.051 72.9368 173.631 72.3034C173.211 71.67 172.616 71.1769 171.919 70.8865C171.223 70.5961 170.457 70.5215 169.719 70.6721C168.981 70.8226 168.303 71.1917 167.772 71.7324C167.241 72.2732 166.88 72.9614 166.735 73.71C166.59 74.4586 166.667 75.234 166.957 75.938C167.247 76.642 167.737 77.2431 168.364 77.6651C168.992 78.0872 169.729 78.3112 170.482 78.309C171.107 78.3086 171.723 78.1535 172.276 77.8573L171.868 77.4511C171.435 77.6596 170.961 77.7672 170.482 77.7662C169.834 77.7707 169.199 77.5802 168.658 77.2188C168.117 76.8575 167.695 76.3416 167.444 75.7365C167.193 75.1314 167.125 74.4645 167.248 73.8202C167.372 73.1759 167.682 72.5834 168.138 72.1177C168.595 71.652 169.178 71.3341 169.813 71.2044C170.448 71.0747 171.107 71.139 171.706 71.3891C172.305 71.6392 172.817 72.0639 173.177 72.6093C173.538 73.1547 173.73 73.7962 173.73 74.4526C173.728 74.8979 173.639 75.3384 173.467 75.7483C173.295 76.1582 173.045 76.5294 172.73 76.84L171.032 75.1586L170.658 75.5116L174.09 78.958L174.465 78.605L173.116 77.2234C173.483 76.8628 173.775 76.431 173.975 75.9537C174.174 75.4764 174.277 74.9633 174.277 74.445" fill="white"/> +<path d="M122.447 87.7526L120 86.371V73.6252L126.197 70.1294L128.704 71.5489L122.443 75.0789L122.447 87.7526ZM137.509 83.4977L139.933 82.1047V73.6252L129.967 68L127.453 69.4196L137.509 75.0789V83.4977ZM129.967 89.1646L123.668 85.6081V88.4435L129.967 91.9962L139.933 86.371V83.5357L129.967 89.1646Z" fill="white"/> +<path d="M214.047 70.8921H213.754V89.1682H214.047V70.8921Z" fill="white"/> +<path d="M218.442 80.2067V70.8921H236.801V89.4909H218.442V80.2067Z" stroke="white" stroke-miterlimit="10"/> +<path d="M220.315 88.1246C220.217 88.0906 220.129 88.0319 220.059 87.954C219.989 87.8761 219.94 87.7816 219.916 87.6792C219.892 87.5769 219.894 87.4701 219.922 87.3688C219.95 87.2674 220.003 87.1749 220.075 87.0998C220.13 87.0403 220.197 86.9943 220.272 86.9653C220.346 86.9364 220.427 86.9252 220.506 86.9328C220.602 86.9217 220.698 86.9402 220.783 86.9859C220.937 87.0619 220.945 87.077 220.873 87.1643L220.817 87.2402L220.746 87.1947C220.685 87.1492 220.613 87.122 220.538 87.1165C220.463 87.111 220.388 87.1273 220.321 87.1636C220.255 87.1998 220.2 87.2545 220.163 87.3211C220.126 87.3878 220.109 87.4638 220.113 87.5401C220.11 87.6125 220.125 87.6844 220.159 87.7486C220.192 87.8128 220.241 87.867 220.302 87.9056C220.362 87.9441 220.432 87.9658 220.503 87.9682C220.575 87.9707 220.646 87.954 220.709 87.9197C220.772 87.8855 220.772 87.8817 220.78 87.7678V87.654H220.484V87.468H220.982V87.7223V87.9766L220.907 88.0297C220.821 88.0856 220.725 88.1231 220.625 88.1401C220.524 88.1571 220.422 88.1531 220.323 88.1284L220.315 88.1246ZM223.264 88.1246C223.142 88.0859 223.037 88.0071 222.964 87.9007C222.914 87.8268 222.881 87.7428 222.866 87.6546C222.851 87.5664 222.855 87.476 222.878 87.3896C222.901 87.3031 222.942 87.2226 222.998 87.1536C223.054 87.0846 223.124 87.0287 223.204 86.9897C223.284 86.949 223.373 86.9319 223.463 86.9404C223.542 86.9377 223.621 86.9516 223.694 86.9813C223.768 87.0109 223.835 87.0556 223.891 87.1126C223.947 87.1696 223.991 87.2376 224.019 87.3125C224.048 87.3873 224.061 87.4674 224.058 87.5477C224.067 87.6383 224.049 87.7296 224.006 87.8096C223.94 87.9405 223.833 88.0458 223.702 88.1095C223.562 88.1605 223.409 88.1632 223.268 88.117L223.264 88.1246ZM223.639 87.9197C223.698 87.8814 223.747 87.829 223.783 87.7671C223.818 87.7052 223.837 87.6355 223.84 87.5642C223.842 87.4928 223.828 87.4219 223.797 87.3575C223.767 87.2932 223.721 87.2373 223.665 87.1947C223.599 87.1436 223.519 87.1159 223.436 87.1159C223.354 87.1159 223.273 87.1436 223.208 87.1947C223.15 87.2461 223.107 87.3124 223.083 87.3866C223.059 87.4607 223.056 87.54 223.073 87.616C223.08 87.6794 223.102 87.7401 223.138 87.7924C223.174 87.8448 223.222 87.8871 223.279 87.9154C223.335 87.9438 223.398 87.9573 223.461 87.9548C223.523 87.9522 223.585 87.9336 223.639 87.9007V87.9197ZM224.811 88.1246C224.75 88.1002 224.694 88.0629 224.647 88.0152C224.601 87.9674 224.565 87.9103 224.542 87.8476C224.52 87.6866 224.512 87.524 224.519 87.3617V86.9404H224.617H224.714V87.3503C224.714 87.802 224.714 87.84 224.849 87.9083C224.896 87.9292 224.947 87.94 224.999 87.94C225.05 87.94 225.101 87.9292 225.149 87.9083C225.265 87.8438 225.272 87.8172 225.283 87.3541V86.9366H225.381H225.478V87.3807C225.478 87.7944 225.478 87.8286 225.433 87.9007C225.37 88.0067 225.272 88.0864 225.155 88.1254C225.039 88.1643 224.913 88.16 224.8 88.1133L224.811 88.1246ZM221.48 88.1246C221.48 88.1246 221.48 87.8476 221.48 87.5363V86.967H221.814C222.125 86.967 222.151 86.967 222.234 87.0125C222.311 87.0558 222.37 87.1252 222.402 87.2085C222.433 87.2918 222.435 87.3837 222.406 87.468C222.387 87.515 222.359 87.5576 222.324 87.5935C222.288 87.6294 222.246 87.6577 222.2 87.6767C222.185 87.6718 222.169 87.6718 222.155 87.6767C222.155 87.6767 222.219 87.7716 222.293 87.8817C222.348 87.9533 222.398 88.0281 222.443 88.1057C222.443 88.1057 222.425 88.1284 222.342 88.1284H222.23L222.087 87.9235L221.945 87.7185H221.679V88.1284H221.585C221.529 88.1284 221.488 88.1284 221.484 88.1057L221.48 88.1246ZM222.125 87.5059C222.161 87.4859 222.189 87.4536 222.204 87.4148C222.219 87.3759 222.22 87.333 222.207 87.2934C222.174 87.1757 222.121 87.1529 221.885 87.1529H221.683V87.3275C221.676 87.3944 221.676 87.4619 221.683 87.5287C221.683 87.5515 221.731 87.5553 221.885 87.5515C222.039 87.5477 222.095 87.5211 222.136 87.4908L222.125 87.5059ZM226.007 88.1398V86.9518H226.31C226.584 86.9518 226.617 86.9518 226.685 86.9935C226.752 87.022 226.808 87.0711 226.845 87.1338C226.883 87.1965 226.9 87.2696 226.895 87.3427C226.899 87.3895 226.894 87.4366 226.879 87.4811C226.864 87.5256 226.84 87.5664 226.808 87.6008C226.711 87.7033 226.629 87.7299 226.408 87.7413H226.205V88.1208H226.112C226.059 88.1208 226.018 88.1208 226.018 88.1208L226.007 88.1398ZM226.576 87.5439C226.6 87.5312 226.622 87.5136 226.639 87.4922C226.657 87.4708 226.67 87.4461 226.678 87.4194C226.685 87.3928 226.688 87.3649 226.684 87.3374C226.681 87.3098 226.672 87.2832 226.659 87.2592C226.617 87.1757 226.554 87.1529 226.366 87.1529H226.198V87.3389C226.193 87.4084 226.193 87.4782 226.198 87.5477C226.32 87.5831 226.45 87.5831 226.572 87.5477L226.576 87.5439ZM227.326 88.1246C227.326 88.1246 227.326 87.8476 227.326 87.5363V86.967H228.184V87.1492H227.858H227.532V87.449H228.112V87.635H227.52V87.7868V87.9424H227.858H228.195V88.0297V88.117H227.768C227.434 88.117 227.337 88.117 227.329 88.117L227.326 88.1246ZM229.323 85.3614V84.2569H229.532H229.739V84.4694L229.791 84.4011C229.838 84.3532 229.892 84.3134 229.952 84.2834C230.038 84.2362 230.136 84.2176 230.233 84.2303C230.33 84.2196 230.428 84.2381 230.514 84.2834C230.655 84.3616 230.77 84.4806 230.844 84.6253C230.918 84.77 230.948 84.9338 230.93 85.0957C230.939 85.2501 230.904 85.404 230.829 85.5387C230.754 85.6735 230.642 85.7833 230.507 85.8548C230.427 85.8923 230.339 85.908 230.252 85.9004C230.175 85.9066 230.097 85.8955 230.025 85.868C229.952 85.8404 229.886 85.7971 229.832 85.741L229.757 85.6612V86.4204H229.308L229.323 85.3614ZM230.327 85.5398C230.403 85.4656 230.458 85.3726 230.488 85.2702C230.517 85.1677 230.52 85.0591 230.495 84.9553C230.484 84.8328 230.428 84.7191 230.338 84.6364C230.298 84.6037 230.252 84.5803 230.202 84.5682C230.152 84.5561 230.101 84.5555 230.051 84.5664C230.001 84.5774 229.954 84.5996 229.913 84.6314C229.873 84.6632 229.84 84.7039 229.817 84.7503C229.667 85.0615 229.768 85.5094 230.005 85.5815C230.113 85.6103 230.229 85.5954 230.327 85.5398V85.5398ZM220.21 85.9194C220.064 85.8701 219.936 85.7763 219.844 85.6506C219.752 85.5249 219.701 85.3735 219.697 85.2172C219.667 85.0535 219.683 84.8848 219.742 84.7295C219.801 84.5742 219.9 84.4383 220.03 84.3366C220.151 84.2595 220.294 84.2259 220.436 84.2411C220.578 84.2562 220.711 84.3192 220.813 84.4201L220.855 84.4694V83.623H221.297V84.7427V85.8814H221.098H220.903V85.7789C220.908 85.7449 220.908 85.7104 220.903 85.6764L220.806 85.7637C220.728 85.8317 220.634 85.8787 220.533 85.9006C220.432 85.9225 220.328 85.9185 220.229 85.889L220.21 85.9194ZM220.619 85.5929C220.675 85.5686 220.725 85.5312 220.765 85.4838C220.805 85.4363 220.833 85.3801 220.847 85.3196C220.888 85.1423 220.879 84.9568 220.821 84.7845C220.803 84.7391 220.776 84.6982 220.741 84.6644C220.706 84.6306 220.665 84.6047 220.62 84.5886C220.574 84.5724 220.526 84.5662 220.478 84.5706C220.43 84.5749 220.383 84.5896 220.341 84.6136C220.259 84.668 220.195 84.7456 220.157 84.8367C220.118 84.9278 220.107 85.0285 220.124 85.1261C220.143 85.4791 220.345 85.6688 220.619 85.5929V85.5929ZM222.061 85.9269C221.95 85.907 221.844 85.8627 221.752 85.7972C221.659 85.7316 221.582 85.6463 221.525 85.5474C221.464 85.4156 221.433 85.2717 221.433 85.1261C221.433 84.9804 221.464 84.8366 221.525 84.7047C221.619 84.5263 221.774 84.3889 221.962 84.3189C222.149 84.2489 222.355 84.2512 222.541 84.3252C222.686 84.3953 222.809 84.5071 222.893 84.6466C222.976 84.7862 223.018 84.9476 223.013 85.1109V85.2361H222.443C221.799 85.2361 221.851 85.2361 221.904 85.3993C221.925 85.4636 221.963 85.521 222.013 85.5655C222.064 85.61 222.125 85.64 222.191 85.6524C222.256 85.6648 222.324 85.6591 222.387 85.636C222.45 85.6129 222.506 85.5731 222.548 85.5208L222.623 85.4411H222.998L222.968 85.5094C222.933 85.6061 222.877 85.6936 222.804 85.7658C222.732 85.838 222.644 85.893 222.548 85.9269C222.395 85.9721 222.234 85.9838 222.076 85.9611L222.061 85.9269ZM222.563 84.8831C222.548 84.7969 222.509 84.7168 222.451 84.6516C222.402 84.6165 222.346 84.5936 222.287 84.5849C222.228 84.5762 222.168 84.5819 222.111 84.6016C222.055 84.6213 222.004 84.6543 221.962 84.698C221.921 84.7417 221.891 84.7948 221.874 84.8528V84.9249H222.578L222.563 84.8831ZM223.755 85.9004C223.607 85.8787 223.468 85.8126 223.358 85.7106C223.282 85.6323 223.233 85.531 223.219 85.4221V85.3424H223.425C223.605 85.3424 223.631 85.3424 223.639 85.3766C223.652 85.442 223.686 85.5011 223.737 85.5444C223.787 85.5878 223.85 85.6128 223.916 85.6157C224.103 85.6385 224.253 85.555 224.253 85.4221C224.253 85.2893 224.201 85.2741 223.852 85.183C223.504 85.0919 223.388 85.0312 223.32 84.9287C223.253 84.8262 223.271 84.8338 223.271 84.7123C223.263 84.6395 223.274 84.5656 223.304 84.4987C223.333 84.4318 223.38 84.3744 223.44 84.3328C223.589 84.2302 223.77 84.1857 223.95 84.2075C224.128 84.1878 224.308 84.2336 224.455 84.3366C224.554 84.4187 224.621 84.5326 224.647 84.6592V84.7199H224.437C224.257 84.7199 224.227 84.7199 224.227 84.6896C224.227 84.5795 224.099 84.496 223.931 84.496C223.762 84.496 223.669 84.5681 223.702 84.6896C223.736 84.811 223.785 84.7882 224.077 84.8642C224.478 84.9666 224.605 85.0426 224.662 85.2134C224.69 85.3407 224.677 85.4738 224.624 85.5929C224.553 85.7226 224.435 85.8192 224.294 85.8624C224.118 85.9081 223.935 85.9196 223.755 85.8966V85.9004ZM228.251 85.9004C228.111 85.8624 227.982 85.7893 227.876 85.6878C227.734 85.5529 227.641 85.3719 227.616 85.1758C227.59 84.9797 227.632 84.7807 227.735 84.6127C227.838 84.4446 227.996 84.3181 228.181 84.2546C228.366 84.191 228.567 84.1945 228.749 84.2644C228.898 84.3359 229.022 84.4499 229.106 84.5923C229.191 84.7347 229.232 84.8993 229.225 85.0653V85.1754H228.082V85.2627C228.09 85.3493 228.129 85.43 228.192 85.4889C228.255 85.5479 228.338 85.5809 228.423 85.5815C228.497 85.5922 228.572 85.5775 228.637 85.5398C228.69 85.5176 228.735 85.4807 228.768 85.4335C228.798 85.3804 228.798 85.3804 228.989 85.3804C229.18 85.3804 229.199 85.3804 229.109 85.5474C229.023 85.6908 228.894 85.8026 228.741 85.8661C228.588 85.9297 228.419 85.9417 228.259 85.9004H228.251ZM228.764 84.8718C228.756 84.8096 228.734 84.7502 228.701 84.6976C228.667 84.6451 228.622 84.6009 228.569 84.5681C228.499 84.544 228.424 84.5387 228.351 84.5527C228.278 84.5666 228.21 84.5994 228.154 84.6478C228.109 84.7107 228.079 84.7836 228.067 84.8604C228.067 84.8945 228.067 84.8983 228.416 84.8983C228.764 84.8983 228.764 84.8983 228.764 84.8718V84.8718ZM231.796 85.9004C231.645 85.8675 231.506 85.7956 231.391 85.6916C231.263 85.5429 231.183 85.3582 231.161 85.1622C231.14 84.9661 231.178 84.7681 231.271 84.5947C231.351 84.4737 231.459 84.3752 231.587 84.3084C231.714 84.2416 231.856 84.2088 232 84.213C232.143 84.2171 232.283 84.2582 232.407 84.3323C232.531 84.4063 232.633 84.511 232.706 84.6364C232.764 84.7706 232.793 84.9153 232.793 85.0615C232.793 85.2078 232.764 85.3525 232.706 85.4866C232.62 85.647 232.484 85.7742 232.32 85.8489C232.155 85.9237 231.971 85.9417 231.796 85.9004V85.9004ZM232.17 85.5208C232.223 85.4797 232.266 85.4264 232.294 85.3652C232.34 85.2793 232.359 85.1815 232.35 85.0843C232.368 84.9356 232.328 84.7857 232.238 84.6668C232.206 84.6253 232.165 84.5922 232.118 84.5704C232.071 84.5486 232.02 84.5387 231.968 84.5415C231.899 84.5392 231.83 84.5583 231.772 84.5963C231.714 84.6343 231.669 84.6893 231.642 84.7541C231.604 84.8186 231.601 84.8566 231.601 85.0615C231.601 85.2665 231.601 85.3007 231.642 85.369C231.685 85.4543 231.755 85.5225 231.841 85.5626C231.952 85.5896 232.069 85.5747 232.17 85.5208V85.5208ZM234.516 85.9004C234.388 85.8799 234.266 85.8306 234.16 85.7561C234.068 85.6693 234.006 85.5549 233.984 85.4297V85.3424H234.388L234.411 85.4183C234.441 85.4902 234.495 85.5491 234.563 85.5845C234.632 85.62 234.711 85.6297 234.786 85.6119C234.95 85.5929 235.048 85.4601 234.988 85.3424C234.958 85.2855 234.845 85.2399 234.583 85.1792C234.231 85.0919 234.122 85.035 234.051 84.8983C234.013 84.7878 234.013 84.6673 234.051 84.5567C234.093 84.4473 234.171 84.356 234.272 84.2986C234.552 84.1848 234.865 84.1848 235.145 84.2986C235.214 84.3381 235.273 84.3927 235.319 84.4584C235.364 84.524 235.394 84.5991 235.408 84.6782V84.7313H235.007V84.6782C234.984 84.5681 234.875 84.5074 234.711 84.5074C234.546 84.5074 234.441 84.5909 234.482 84.7009C234.523 84.811 234.576 84.8034 234.875 84.8793C235.175 84.9553 235.329 85.0198 235.408 85.1488C235.453 85.2126 235.473 85.2911 235.464 85.369C235.467 85.4318 235.458 85.4947 235.436 85.5535C235.414 85.6124 235.38 85.6659 235.336 85.7106C235.227 85.8011 235.098 85.8653 234.961 85.8981C234.823 85.931 234.68 85.9318 234.542 85.9004H234.516ZM225.523 85.8738C225.523 85.8738 225.523 85.3576 225.523 84.7351V83.623H226.052C226.356 83.581 226.665 83.6189 226.951 83.7331C227.073 83.7988 227.18 83.8911 227.264 84.0032C227.347 84.1154 227.405 84.2447 227.434 84.3821C227.475 84.6258 227.475 84.8748 227.434 85.1185C227.4 85.2883 227.321 85.4455 227.206 85.5733C227.09 85.701 226.943 85.7944 226.778 85.8434C226.56 85.8836 226.337 85.8976 226.115 85.8852C225.801 85.9004 225.561 85.9004 225.535 85.8738H225.523ZM226.685 85.4031C226.802 85.3202 226.892 85.2034 226.943 85.068C226.993 84.9326 227.003 84.7849 226.97 84.644C226.967 84.5541 226.945 84.4658 226.906 84.3852C226.866 84.3046 226.81 84.2336 226.741 84.1771C226.595 84.0865 226.424 84.049 226.254 84.0709H226.003V85.4753H226.31C226.584 85.4753 226.625 85.4753 226.685 85.4259V85.4031ZM233.373 85.8624C233.289 85.8378 233.216 85.784 233.167 85.7106C233.129 85.6537 233.129 85.6119 233.122 85.0957V84.5453H232.867V84.2455H233.122V83.7634H233.564V84.2455H233.875V84.5453H233.564V84.997C233.564 85.5474 233.564 85.5398 233.755 85.5398H233.875V85.9004H233.65C233.558 85.8975 233.466 85.8848 233.377 85.8624H233.373ZM231.447 84.0481C231.447 84.0481 231.518 83.9418 231.608 83.8279L231.766 83.6154H232.181L232.331 83.8128C232.388 83.8841 232.441 83.9589 232.489 84.0367C232.489 84.0367 232.466 84.0595 232.328 84.0367H232.155L232.065 83.9114C232.034 83.8678 232 83.826 231.964 83.7862C231.923 83.8245 231.886 83.8678 231.855 83.9152L231.758 84.0443H231.604C231.552 84.0525 231.499 84.0525 231.447 84.0443V84.0481ZM228.184 83.9532C228.184 83.9532 228.258 83.8166 228.345 83.6723L228.498 83.4104H228.978L228.922 83.4712L228.671 83.7482L228.472 83.9684H228.322C228.275 83.9735 228.228 83.9683 228.184 83.9532V83.9532ZM220.641 82.8638C220.429 82.837 220.231 82.744 220.074 82.5977C219.917 82.4515 219.809 82.2592 219.764 82.0478C219.723 81.8245 219.723 81.5954 219.764 81.3721C219.806 81.1823 219.897 81.0074 220.029 80.8663C220.161 80.7252 220.329 80.6232 220.514 80.5713C220.704 80.5334 220.9 80.5334 221.091 80.5713C221.251 80.6126 221.396 80.6985 221.51 80.8193C221.624 80.9401 221.702 81.0909 221.735 81.2545V81.3418H221.271L221.248 81.2659C221.215 81.1898 221.166 81.1225 221.103 81.0693C221.04 81.0162 220.966 80.9787 220.886 80.9599C220.806 80.9411 220.723 80.9415 220.644 80.961C220.564 80.9805 220.49 81.0186 220.428 81.0723C220.326 81.1773 220.255 81.3086 220.221 81.4519C220.194 81.6598 220.206 81.8713 220.259 82.0743C220.312 82.2131 220.414 82.3277 220.544 82.397C220.688 82.4462 220.845 82.4462 220.99 82.397C221.063 82.3608 221.126 82.3076 221.175 82.2416C221.224 82.1756 221.257 82.0987 221.271 82.0174L221.293 81.9339H221.518H221.746V81.9795C221.723 82.2033 221.627 82.4129 221.473 82.5754C221.362 82.6817 221.228 82.7603 221.081 82.8051C220.935 82.8499 220.781 82.8596 220.63 82.8335L220.641 82.8638ZM222.264 82.8638C222.156 82.8409 222.061 82.7769 221.998 82.6851C221.935 82.5934 221.91 82.4807 221.926 82.3704C221.925 82.2934 221.948 82.218 221.99 82.1541C222.084 81.9984 222.226 81.9453 222.679 81.8846C222.897 81.8542 222.96 81.8124 222.968 81.691C222.974 81.6653 222.972 81.6385 222.963 81.6137C222.955 81.5889 222.94 81.567 222.919 81.5505C222.881 81.5122 222.83 81.4893 222.777 81.486C222.705 81.4606 222.627 81.4636 222.557 81.4946C222.487 81.5256 222.432 81.5823 222.402 81.653L222.383 81.7176H221.964L221.982 81.6303C222.001 81.5262 222.056 81.4322 222.136 81.3646C222.22 81.2962 222.317 81.2456 222.42 81.2156C222.524 81.1856 222.632 81.1769 222.739 81.19C222.926 81.1738 223.112 81.2219 223.268 81.3266C223.403 81.4405 223.399 81.4329 223.414 82.1351C223.414 82.4843 223.414 82.7879 223.436 82.8107C223.459 82.8335 223.436 82.8525 223.238 82.8525H223.024V82.7993C223.005 82.6968 223.002 82.6968 222.945 82.7462C222.742 82.8751 222.497 82.9175 222.264 82.8638V82.8638ZM222.841 82.5374C222.887 82.4967 222.923 82.4448 222.946 82.3866C222.968 82.3283 222.975 82.2654 222.968 82.2034C222.977 82.1596 222.977 82.1144 222.968 82.0705H222.912C222.844 82.0919 222.776 82.1071 222.706 82.1161C222.507 82.1503 222.428 82.192 222.383 82.2793C222.361 82.3231 222.355 82.3739 222.368 82.4217C222.38 82.4695 222.41 82.5108 222.451 82.5374C222.513 82.5664 222.581 82.5814 222.649 82.5814C222.718 82.5814 222.786 82.5664 222.848 82.5374H222.841ZM224.834 82.86C224.774 82.8476 224.715 82.8311 224.658 82.8107C224.577 82.7716 224.506 82.7132 224.452 82.6406C224.398 82.5679 224.362 82.483 224.347 82.3932V82.3325H224.748V82.3818C224.774 82.4321 224.812 82.4757 224.857 82.5093C224.903 82.5429 224.955 82.5657 225.011 82.5759C225.066 82.5861 225.123 82.5835 225.178 82.5683C225.232 82.5531 225.282 82.5257 225.325 82.4881C225.407 82.3818 225.351 82.2793 225.175 82.2224L224.868 82.1351C224.731 82.1168 224.601 82.0617 224.493 81.9757C224.45 81.9423 224.416 81.8982 224.395 81.8476C224.374 81.797 224.366 81.7417 224.373 81.6872C224.369 81.5803 224.403 81.4755 224.468 81.3914C224.533 81.3073 224.626 81.2494 224.729 81.2279C224.932 81.1805 225.144 81.1805 225.347 81.2279C225.443 81.2503 225.531 81.2995 225.6 81.37C225.67 81.4405 225.719 81.5293 225.741 81.6265V81.7062H225.336L225.31 81.634C225.268 81.5316 225.194 81.4936 225.025 81.4936C224.856 81.4936 224.811 81.524 224.789 81.6075C224.785 81.6442 224.794 81.6811 224.814 81.7121C224.834 81.7431 224.863 81.7665 224.898 81.7783C224.924 81.7783 225.062 81.8314 225.205 81.8656C225.561 81.9529 225.696 82.0326 225.752 82.1806C225.784 82.3051 225.784 82.4357 225.752 82.5602C225.701 82.6621 225.623 82.7475 225.527 82.8069C225.302 82.906 225.052 82.9312 224.811 82.879L224.834 82.86ZM226.49 82.86C226.369 82.8454 226.256 82.7922 226.168 82.7083C226.079 82.6244 226.018 82.5141 225.995 82.3932V82.3249H226.205C226.393 82.3249 226.415 82.3249 226.415 82.3552C226.423 82.3961 226.441 82.4344 226.466 82.4673C226.492 82.5002 226.524 82.5268 226.561 82.545C226.616 82.5731 226.676 82.5862 226.737 82.583C226.913 82.583 227.03 82.5071 227.03 82.3894C227.03 82.2717 226.985 82.2452 226.572 82.1351C226.261 82.0516 226.16 82.0022 226.089 81.8922C226.048 81.831 226.031 81.7567 226.04 81.6834C226.04 81.3987 226.216 81.2317 226.572 81.1862C227.015 81.1292 227.356 81.3038 227.415 81.6227V81.691H226.996V81.6378C226.996 81.5581 226.921 81.5088 226.812 81.486C226.595 81.4405 226.438 81.5354 226.482 81.6796C226.501 81.7365 226.614 81.7859 226.88 81.8504C226.992 81.8724 227.102 81.9041 227.209 81.9453C227.286 81.9724 227.352 82.024 227.398 82.0925C227.443 82.161 227.465 82.2426 227.46 82.3249C227.462 82.4374 227.426 82.5471 227.358 82.636C227.289 82.725 227.194 82.7879 227.086 82.8145C226.889 82.864 226.684 82.8755 226.482 82.8487L226.49 82.86ZM228.21 82.86C228.076 82.8271 227.954 82.7577 227.857 82.6593C227.76 82.5609 227.692 82.4373 227.659 82.3021C227.623 82.1255 227.623 81.9435 227.659 81.7669C227.699 81.6175 227.782 81.4833 227.896 81.3808C228.011 81.2783 228.152 81.2119 228.303 81.19C228.405 81.1711 228.51 81.1738 228.611 81.198C228.712 81.2221 228.806 81.2672 228.889 81.3303C228.972 81.3935 229.041 81.4733 229.092 81.5648C229.142 81.6562 229.174 81.7574 229.184 81.8618C229.195 81.9309 229.203 82.0006 229.206 82.0705V82.1427H228.045V82.2186C228.057 82.3105 228.101 82.3948 228.171 82.4556C228.24 82.5164 228.328 82.5496 228.42 82.5488C228.477 82.5506 228.533 82.5392 228.585 82.5156C228.637 82.4919 228.683 82.4565 228.719 82.4122L228.779 82.3438H228.963H229.147L229.083 82.4729C229.022 82.605 228.923 82.715 228.798 82.7879C228.603 82.8719 228.387 82.8931 228.18 82.8487L228.21 82.86ZM228.761 81.8124C228.754 81.7612 228.736 81.7121 228.708 81.6687C228.681 81.6252 228.644 81.5886 228.6 81.5613C228.557 81.5341 228.508 81.517 228.458 81.5112C228.407 81.5054 228.355 81.511 228.307 81.5278C228.245 81.5481 228.19 81.5854 228.148 81.6357C228.105 81.686 228.077 81.7472 228.067 81.8124V81.8618H228.783L228.761 81.8124ZM223.706 82.0402V81.2127H224.126V82.8335H223.706V82.0402ZM223.706 80.7838V80.5864H224.126V80.966H223.706V80.7838ZM232.699 80.6965C232.067 80.6235 231.453 80.4425 230.881 80.1613C230.204 79.8332 229.597 79.3729 229.096 78.8069C228.594 78.2409 228.208 77.5803 227.959 76.8629C227.618 75.8799 227.546 74.8219 227.751 73.8009C227.955 72.7799 228.428 71.8339 229.12 71.0631L229.259 70.9075H229.881L229.637 71.1542C228.933 71.8602 228.439 72.7529 228.211 73.7301C227.984 74.7073 228.033 75.7296 228.352 76.68C228.672 77.6304 229.249 78.4706 230.017 79.1044C230.786 79.7381 231.715 80.1399 232.699 80.2638C233.135 80.3056 233.574 80.3056 234.01 80.2638C234.983 80.14 235.904 79.7459 236.67 79.1251L236.801 79.015V79.573L236.663 79.6793C236.26 79.963 235.826 80.1986 235.37 80.3815C234.918 80.5478 234.45 80.6612 233.972 80.7193C233.549 80.7554 233.122 80.7554 232.699 80.7193V80.6965ZM232.965 79.9715C232.811 79.9184 232.777 79.7856 232.897 79.6907C232.942 79.6565 232.942 79.6565 232.897 79.6148C232.873 79.587 232.86 79.5512 232.86 79.5142C232.86 79.4771 232.873 79.4413 232.897 79.4136C232.918 79.3938 232.942 79.3789 232.969 79.3698C232.996 79.3607 233.025 79.3577 233.053 79.361C233.081 79.3642 233.108 79.3737 233.133 79.3887C233.157 79.4036 233.177 79.4238 233.193 79.4477C233.223 79.5199 233.193 79.611 233.144 79.6261C233.096 79.6413 233.103 79.6261 233.144 79.7096C233.168 79.7338 233.185 79.7639 233.193 79.7969C233.191 79.8271 233.181 79.8563 233.166 79.8823C233.151 79.9084 233.13 79.9306 233.105 79.9474C233.081 79.9642 233.052 79.975 233.023 79.9792C232.993 79.9834 232.963 79.9808 232.935 79.9715H232.965ZM233.088 79.8994C233.148 79.8577 233.141 79.7931 233.088 79.7324C233.036 79.6717 233.006 79.6793 232.957 79.7324C232.939 79.7525 232.93 79.7786 232.93 79.8055C232.931 79.8324 232.942 79.8581 232.96 79.8774C232.979 79.8967 233.004 79.9081 233.03 79.9094C233.057 79.9106 233.083 79.9017 233.103 79.8842L233.088 79.8994ZM233.122 79.5882C233.136 79.5665 233.145 79.5418 233.148 79.5161C233.143 79.4901 233.131 79.466 233.113 79.4466C233.095 79.4272 233.072 79.4131 233.047 79.406C233.017 79.406 232.946 79.4705 232.946 79.5009C232.974 79.5561 233.019 79.6012 233.073 79.6299C233.073 79.6299 233.103 79.6299 233.118 79.5882H233.122ZM233.332 79.9677C233.332 79.9677 233.354 79.945 233.377 79.9412C233.399 79.9374 233.425 79.9412 233.425 79.7704C233.425 79.5996 233.425 79.6148 233.377 79.5958C233.328 79.5768 233.339 79.5388 233.425 79.535H233.489V79.7362C233.489 79.9222 233.489 79.9336 233.534 79.9374C233.554 79.941 233.571 79.9518 233.583 79.9677C233.583 79.9677 233.553 79.9905 233.459 79.9905C233.365 79.9905 233.328 79.9905 233.328 79.9905L233.332 79.9677ZM233.804 79.9032C233.745 79.8314 233.715 79.7403 233.718 79.6472C233.722 79.5541 233.759 79.4656 233.823 79.3984C233.881 79.3417 233.959 79.3092 234.04 79.3073C234.062 79.3073 234.04 79.3301 233.984 79.3642C233.902 79.4108 233.841 79.4866 233.811 79.5768V79.6223L233.864 79.5806C233.877 79.5658 233.894 79.5539 233.912 79.5459C233.931 79.5378 233.951 79.5336 233.971 79.5336C233.991 79.5336 234.01 79.5378 234.029 79.5459C234.047 79.5539 234.064 79.5658 234.077 79.5806C234.098 79.6038 234.114 79.6312 234.123 79.661C234.132 79.6909 234.135 79.7224 234.131 79.7534C234.127 79.7845 234.117 79.8143 234.1 79.8408C234.084 79.8673 234.062 79.8899 234.036 79.907C234.005 79.9305 233.967 79.9431 233.928 79.9431C233.888 79.9431 233.85 79.9305 233.819 79.907L233.804 79.9032ZM234.006 79.8577C234.024 79.8321 234.033 79.8016 234.033 79.7704C234.033 79.7391 234.024 79.7086 234.006 79.6831C233.999 79.6659 233.987 79.6509 233.973 79.6393C233.959 79.6276 233.942 79.6198 233.923 79.6164C233.905 79.613 233.887 79.6142 233.869 79.6199C233.851 79.6256 233.835 79.6355 233.823 79.6489C233.789 79.6793 233.785 79.6945 233.796 79.7514C233.819 79.8804 233.916 79.9336 233.991 79.8577H234.006ZM232.62 79.8994H232.541C232.489 79.8994 232.485 79.8539 232.541 79.8539C232.597 79.8539 232.594 79.8539 232.62 79.6755C232.646 79.4971 232.639 79.5312 232.62 79.5161C232.601 79.5009 232.59 79.4629 232.665 79.4629C232.74 79.4629 232.74 79.4629 232.74 79.5123C232.734 79.5786 232.724 79.6445 232.71 79.7096C232.71 79.7894 232.684 79.8577 232.684 79.8615C232.684 79.8653 232.684 79.8615 232.721 79.8615C232.758 79.8615 232.758 79.8615 232.758 79.8918C232.758 79.9222 232.71 79.9146 232.639 79.8918L232.62 79.8994ZM234.538 79.6337C234.493 79.5882 234.49 79.554 234.538 79.5161C234.545 79.5066 234.554 79.499 234.565 79.4937C234.575 79.4884 234.587 79.4857 234.598 79.4857C234.61 79.4857 234.621 79.4884 234.632 79.4937C234.642 79.499 234.651 79.5066 234.658 79.5161C234.668 79.5226 234.676 79.5316 234.682 79.5422C234.688 79.5528 234.691 79.5647 234.691 79.5768C234.691 79.5889 234.688 79.6008 234.682 79.6114C234.676 79.622 234.668 79.631 234.658 79.6375C234.572 79.6793 234.553 79.6793 234.52 79.6337H234.538ZM235.22 79.592C235.194 79.5654 235.19 79.4667 235.22 79.4667C235.236 79.4707 235.251 79.48 235.261 79.4933C235.295 79.535 235.344 79.5275 235.4 79.4933C235.456 79.4591 235.449 79.4439 235.43 79.4022C235.411 79.3604 235.4 79.3566 235.273 79.3491C235.145 79.3415 235.127 79.3491 235.082 79.2921C235.064 79.2775 235.05 79.2592 235.041 79.2386C235.031 79.2179 235.026 79.1954 235.026 79.1726C235.026 79.1497 235.031 79.1272 235.041 79.1065C235.05 79.0859 235.064 79.0676 235.082 79.053C235.149 78.9964 235.234 78.9655 235.321 78.9657C235.363 78.9657 235.393 79.0568 235.374 79.1023C235.355 79.1479 235.355 79.1327 235.318 79.1023C235.28 79.072 235.265 79.053 235.224 79.0606C235.112 79.091 235.07 79.182 235.142 79.2466C235.213 79.3111 235.209 79.2769 235.295 79.2769C235.381 79.2769 235.426 79.2769 235.464 79.3263C235.501 79.3756 235.501 79.5464 235.333 79.611C235.265 79.6375 235.235 79.6413 235.22 79.611V79.592ZM231.301 79.4895C231.136 79.406 231.084 79.3566 231.174 79.368C231.204 79.368 231.226 79.3339 231.305 79.1631C231.383 78.9923 231.398 78.9505 231.376 78.9126C231.353 78.8746 231.357 78.867 231.376 78.8632C231.508 78.9118 231.633 78.9755 231.751 79.053C231.751 79.0758 231.694 79.1517 231.676 79.1517C231.657 79.1517 231.657 79.1289 231.657 79.1023C231.657 79.0758 231.657 79.0492 231.586 79.0188L231.503 78.9809C231.465 79.0295 231.439 79.0868 231.428 79.1479C231.453 79.1687 231.481 79.1854 231.511 79.1972C231.638 79.2542 231.582 79.2883 231.451 79.2352C231.383 79.2048 231.383 79.2048 231.357 79.2618C231.282 79.4022 231.282 79.406 231.357 79.4515C231.432 79.4971 231.443 79.4895 231.473 79.4515C231.503 79.4136 231.533 79.4136 231.533 79.4515C231.533 79.4895 231.496 79.573 231.481 79.573L231.29 79.4857L231.301 79.4895ZM232.028 79.554C231.987 79.554 231.968 79.5237 231.968 79.5009C231.968 79.4781 231.968 79.4591 232.084 79.5009C232.2 79.5426 232.17 79.5312 232.17 79.5578C232.17 79.5844 232.122 79.5958 232.028 79.5578V79.554ZM235.692 79.3832C235.697 79.3669 235.705 79.3516 235.715 79.3377C235.734 79.3111 235.715 79.2731 235.614 79.0985C235.426 78.7835 235.445 78.7683 235.778 78.9163C235.856 78.9542 235.936 78.9872 236.018 79.015C235.994 78.9616 235.966 78.9096 235.936 78.8594C235.857 78.7304 235.838 78.7152 235.797 78.7152C235.756 78.7152 235.741 78.681 235.842 78.6241C235.943 78.5671 235.932 78.5785 235.932 78.5975C235.931 78.6143 235.924 78.6303 235.913 78.6431C235.96 78.8046 236.05 78.9502 236.172 79.0644C236.232 79.0454 236.224 79.0872 236.172 79.1251L236.112 79.1593L235.861 79.0454C235.781 79.0047 235.698 78.9692 235.614 78.9391C235.643 78.9992 235.675 79.0575 235.711 79.1137C235.801 79.2656 235.808 79.2769 235.857 79.2656C235.906 79.2542 235.917 79.2656 235.823 79.3415C235.73 79.4174 235.704 79.4022 235.704 79.3832H235.692ZM230.713 79.1593C230.57 79.0606 230.57 78.9581 230.713 78.7342C230.795 78.6051 230.81 78.5671 230.791 78.5444C230.773 78.5216 230.791 78.4874 230.889 78.5444C230.986 78.6013 231.012 78.6544 230.93 78.6317C230.848 78.6089 230.874 78.6317 230.791 78.7645C230.753 78.8255 230.717 78.8889 230.686 78.9543C230.687 78.9907 230.698 79.0262 230.718 79.0564C230.738 79.0867 230.766 79.1106 230.799 79.1251C230.881 79.1669 230.941 79.1251 231.057 78.9505C231.174 78.7759 231.155 78.7911 231.132 78.7721C231.11 78.7531 231.095 78.7 231.114 78.7C231.184 78.7357 231.248 78.7818 231.305 78.8366C231.305 78.8366 231.305 78.8366 231.26 78.8366C231.215 78.8366 231.2 78.8366 231.114 78.9809C230.975 79.201 230.859 79.2466 230.713 79.1479V79.1593ZM230.241 79.0074C230.191 78.9585 230.158 78.8946 230.147 78.8253C230.136 78.7642 230.113 78.706 230.079 78.6544C230.054 78.6172 230.036 78.5745 230.029 78.5295C230.022 78.4846 230.024 78.4385 230.037 78.3948C230.05 78.351 230.072 78.3107 230.102 78.2768C230.132 78.2429 230.169 78.2163 230.211 78.199C230.263 78.1759 230.321 78.1693 230.377 78.1801C230.433 78.1909 230.485 78.2186 230.526 78.2595C230.566 78.3005 230.593 78.3528 230.604 78.4097C230.615 78.4666 230.608 78.5254 230.585 78.5785C230.537 78.6584 230.467 78.7219 230.383 78.7607C230.343 78.7648 230.303 78.7648 230.263 78.7607C230.211 78.7607 230.188 78.7607 230.188 78.7607C230.212 78.8466 230.258 78.9241 230.323 78.9847C230.36 79.015 230.383 79.0454 230.379 79.053C230.375 79.0606 230.286 79.0682 230.222 79.0074H230.241ZM230.368 78.6772C230.451 78.6282 230.514 78.5498 230.544 78.4571C230.55 78.4191 230.545 78.3802 230.531 78.3447C230.516 78.3092 230.492 78.2785 230.462 78.2559C230.405 78.2352 230.342 78.236 230.286 78.2584C230.229 78.2807 230.183 78.323 230.154 78.3774C230.119 78.4136 230.099 78.4628 230.099 78.514C230.099 78.5652 230.119 78.6144 230.154 78.6507C230.18 78.679 230.215 78.6972 230.253 78.7021C230.29 78.7069 230.329 78.6981 230.36 78.6772H230.368ZM236.251 78.8177C236.198 78.7857 236.157 78.738 236.132 78.6811C236.107 78.6243 236.101 78.5611 236.113 78.5003C236.125 78.4394 236.156 78.384 236.201 78.3416C236.246 78.2992 236.302 78.2719 236.363 78.2635C236.415 78.2579 236.467 78.267 236.514 78.2898C236.561 78.3126 236.601 78.3482 236.629 78.3925C236.666 78.4338 236.689 78.4857 236.695 78.5408C236.701 78.5959 236.69 78.6516 236.663 78.7C236.647 78.739 236.623 78.7738 236.593 78.8019C236.562 78.83 236.525 78.8505 236.485 78.8618C236.445 78.8732 236.404 78.8752 236.363 78.8675C236.322 78.8598 236.284 78.8428 236.251 78.8177V78.8177ZM236.535 78.7683C236.663 78.7038 236.652 78.5406 236.513 78.3888C236.449 78.3318 236.415 78.3128 236.367 78.3128C236.325 78.3154 236.286 78.3305 236.253 78.3562C236.22 78.382 236.196 78.4171 236.183 78.4571C236.185 78.5302 236.21 78.6008 236.254 78.6583C236.299 78.7158 236.361 78.757 236.43 78.7759C236.459 78.7784 236.489 78.7758 236.517 78.7683H236.535ZM233.272 78.5785C233.38 78.385 233.365 78.3888 233.452 78.5368C233.482 78.5799 233.506 78.6272 233.523 78.6772C233.497 78.6828 233.47 78.6828 233.444 78.6772C233.379 78.6573 233.31 78.6573 233.246 78.6772C233.197 78.6886 233.201 78.6886 233.253 78.5785H233.272ZM233.088 78.4571C233.099 78.4045 233.099 78.3502 233.088 78.2977C233.084 78.2725 233.084 78.2469 233.088 78.2217C233.136 78.2425 233.181 78.2679 233.223 78.2977C233.369 78.385 233.373 78.3736 233.182 78.4798L233.081 78.5368L233.088 78.4571ZM233.542 78.4571C233.497 78.4333 233.455 78.404 233.418 78.3698C233.492 78.3118 233.573 78.2621 233.658 78.2217C233.663 78.2722 233.663 78.3231 233.658 78.3736V78.533L233.534 78.4571H233.542ZM229.712 78.309C229.683 78.2802 229.657 78.2484 229.634 78.2142C229.634 78.2142 229.66 78.2142 229.69 78.2142C229.72 78.2142 229.761 78.2142 229.911 78.0737C230.061 77.9333 230.072 77.9181 230.064 77.8801C230.057 77.8422 230.083 77.8232 230.158 77.9181C230.233 78.013 230.233 78.0471 230.158 78.0092C230.083 77.9712 230.102 78.0092 229.963 78.1382C229.825 78.2673 229.798 78.2977 229.802 78.3394C229.806 78.3812 229.802 78.3925 229.802 78.3925C229.769 78.3698 229.739 78.3431 229.712 78.3128V78.309ZM233.324 78.309L233.246 78.1762L233.197 78.0927H233.354C233.405 78.0891 233.457 78.0891 233.508 78.0927C233.508 78.0927 233.358 78.3584 233.354 78.3584C233.343 78.3413 233.333 78.3235 233.324 78.3052V78.309ZM232.481 78.2673C232.514 78.2137 232.556 78.1662 232.605 78.1269C232.68 78.0699 232.68 78.0661 232.646 78.0471C232.62 78.0269 232.599 78.0018 232.583 77.9731C232.567 77.9444 232.556 77.9128 232.552 77.8801C232.555 77.8716 232.555 77.8622 232.551 77.854C232.547 77.8458 232.54 77.8395 232.532 77.8365C232.523 77.8335 232.514 77.834 232.506 77.8379C232.498 77.8418 232.492 77.8488 232.489 77.8574C232.466 77.8791 232.437 77.8936 232.406 77.8991C232.366 77.911 232.324 77.9117 232.284 77.901C232.243 77.8903 232.207 77.8686 232.178 77.8384C232.14 77.7966 232.144 77.7852 232.211 77.7814C232.279 77.7777 232.26 77.7814 232.249 77.7473C232.238 77.7131 232.23 77.6866 232.219 77.6486C232.193 77.5537 232.219 77.5309 232.305 77.5613C232.346 77.5752 232.382 77.601 232.409 77.6354C232.435 77.6698 232.451 77.7113 232.455 77.7549C232.455 77.8232 232.455 77.827 232.492 77.7928C232.53 77.7587 232.492 77.5271 232.369 77.4626C232.32 77.4429 232.267 77.4347 232.214 77.4387C232.162 77.4426 232.111 77.4586 232.065 77.4854C231.99 77.5309 231.987 77.512 232.065 77.4322C232.196 77.2766 232.391 77.2728 232.762 77.4133C232.862 77.4536 232.965 77.4865 233.069 77.512C233.129 77.512 233.174 77.5423 233.171 77.5537C233.075 77.6651 232.954 77.7511 232.818 77.8042H232.751L232.788 77.7397L232.826 77.679L232.744 77.641C232.71 77.625 232.675 77.6123 232.639 77.603C232.639 77.603 232.639 77.6638 232.639 77.7625C232.639 77.956 232.687 78.013 232.811 78.013C232.935 78.013 232.89 78.013 232.905 78.0775C232.927 78.2066 232.807 78.3015 232.59 78.3204H232.462L232.481 78.2673ZM234.04 78.3166C233.871 78.2711 233.808 78.1952 233.841 78.0775C233.841 78.0244 233.864 78.013 233.905 78.0206C234.036 78.0471 234.096 77.9636 234.096 77.7473C234.096 77.5993 234.096 77.5993 233.972 77.66L233.894 77.7017L233.931 77.7511C233.946 77.7695 233.959 77.7899 233.969 77.8118C233.941 77.8158 233.914 77.8158 233.886 77.8118C233.806 77.7764 233.732 77.729 233.665 77.6714C233.527 77.5613 233.527 77.5613 233.575 77.5499C233.737 77.5099 233.895 77.4605 234.051 77.4019C234.358 77.2842 234.583 77.3108 234.681 77.4702C234.733 77.5575 234.729 77.5651 234.654 77.512C234.617 77.4811 234.572 77.4604 234.525 77.4518C234.477 77.4433 234.428 77.4471 234.382 77.4631C234.336 77.479 234.295 77.5065 234.263 77.543C234.231 77.5794 234.208 77.6236 234.197 77.6714C234.197 77.7397 234.197 77.8384 234.242 77.8384C234.287 77.8384 234.242 77.8384 234.242 77.8194C234.234 77.7897 234.234 77.7581 234.242 77.7283C234.254 77.6863 234.278 77.6487 234.311 77.6198C234.343 77.5909 234.383 77.5719 234.426 77.5651C234.478 77.5651 234.482 77.5651 234.482 77.6182C234.481 77.6564 234.472 77.694 234.456 77.7283C234.426 77.789 234.433 77.8004 234.505 77.8004C234.576 77.8004 234.561 77.8346 234.463 77.8877C234.425 77.9137 234.38 77.9275 234.334 77.9275C234.288 77.9275 234.243 77.9137 234.205 77.8877L234.156 77.8498L234.134 77.9333C234.13 77.9576 234.121 77.9809 234.108 78.0018C234.096 78.0227 234.079 78.0407 234.059 78.0547L234.006 78.0965L234.074 78.1458C234.14 78.1868 234.193 78.2478 234.224 78.3204C234.242 78.3698 234.242 78.3698 234.175 78.3698C234.123 78.3668 234.071 78.3579 234.021 78.3432L234.04 78.3166ZM236.749 78.2483C236.644 78.1382 236.558 78.0775 236.532 78.1003C236.505 78.1231 236.483 78.1269 236.483 78.1003C236.503 78.0587 236.533 78.0224 236.569 77.994L236.651 77.9105V77.9674C236.651 78.013 236.651 78.0358 236.734 78.1155C236.816 78.1952 236.824 78.2217 236.816 78.2635V78.309L236.749 78.2483ZM232.253 78.1155C232.193 78.0965 232.189 78.0813 232.253 78.0358C232.288 78.0124 232.33 78 232.373 78C232.415 78 232.457 78.0124 232.492 78.0358L232.537 78.0699L232.474 78.1117C232.442 78.1293 232.407 78.1385 232.371 78.1385C232.335 78.1385 232.299 78.1293 232.268 78.1117L232.253 78.1155ZM234.261 78.1155C234.194 78.0813 234.186 78.0433 234.239 78.0168C234.272 78.002 234.309 77.996 234.346 77.9993C234.382 78.0026 234.418 78.0152 234.448 78.0358C234.508 78.0851 234.508 78.0965 234.448 78.1231C234.42 78.139 234.387 78.1474 234.355 78.1474C234.322 78.1474 234.29 78.139 234.261 78.1231V78.1155ZM229.39 77.9371C229.3 77.8118 229.274 77.7625 229.296 77.7587C229.303 77.755 229.311 77.7531 229.319 77.7531C229.327 77.7531 229.334 77.755 229.341 77.7587C229.341 77.7587 229.42 77.7321 229.547 77.6372C229.675 77.5423 229.731 77.493 229.727 77.455C229.724 77.4171 229.746 77.3981 229.821 77.5006C229.896 77.6031 229.885 77.6372 229.821 77.5917C229.757 77.5461 229.765 77.5917 229.604 77.7055L229.416 77.8498C229.429 77.879 229.447 77.906 229.469 77.9295C229.517 77.994 229.532 78.0016 229.581 77.994C229.63 77.9864 229.634 77.994 229.634 77.994C229.612 78.0375 229.576 78.0723 229.532 78.0927C229.48 78.041 229.434 77.9837 229.394 77.9219L229.39 77.9371ZM233.287 77.9636C233.287 77.9409 233.253 77.9295 233.231 77.9371C233.208 77.9447 233.144 77.8839 233.163 77.8498C233.182 77.8156 233.163 77.8498 233.137 77.8232C233.111 77.7966 233.096 77.7359 233.204 77.641C233.242 77.6045 233.285 77.5738 233.332 77.5499C233.428 77.6042 233.512 77.6778 233.579 77.7663C233.577 77.7767 233.572 77.7865 233.566 77.795C233.559 77.8035 233.551 77.8105 233.542 77.8156C233.532 77.8215 233.524 77.8292 233.518 77.8383C233.511 77.8474 233.507 77.8578 233.504 77.8687C233.504 77.9067 233.455 77.9485 233.425 77.9371C233.395 77.9257 233.392 77.9371 233.38 77.9636C233.369 77.9902 233.309 78.0092 233.287 77.9636ZM231.829 77.8004C231.781 77.8004 231.792 77.7473 231.855 77.6904C231.882 77.6667 231.915 77.6513 231.95 77.6459C231.986 77.6406 232.022 77.6454 232.054 77.66C232.095 77.6866 232.032 77.7701 231.949 77.7928C231.923 77.7974 231.897 77.7974 231.87 77.7928H231.829V77.8004ZM234.726 77.8004C234.678 77.7854 234.637 77.7563 234.606 77.7169C234.583 77.6866 234.583 77.679 234.606 77.6638C234.634 77.6491 234.666 77.6415 234.698 77.6415C234.729 77.6415 234.761 77.6491 234.789 77.6638C234.834 77.6903 234.89 77.7587 234.879 77.7701C234.837 77.7826 234.792 77.7852 234.748 77.7777L234.726 77.8004ZM236.756 77.7814C236.754 77.7676 236.754 77.7535 236.756 77.7397C236.756 77.7169 236.756 77.7207 236.756 77.7397C236.756 77.7587 236.756 77.7814 236.756 77.7814C236.756 77.7814 236.775 77.7663 236.779 77.7587L236.756 77.7814ZM229.147 77.5309C229.067 77.438 229.005 77.3312 228.963 77.2159C228.963 77.2159 228.989 77.2159 229.004 77.2159C229.019 77.2159 229.053 77.2387 229.24 77.1286C229.428 77.0185 229.446 77.0071 229.446 76.9578C229.446 76.9084 229.446 76.9046 229.476 76.9388C229.51 76.9928 229.542 77.0485 229.57 77.1058C229.619 77.2045 229.634 77.2501 229.622 77.288C229.609 77.3212 229.586 77.349 229.555 77.3669C229.524 77.3848 229.489 77.3918 229.454 77.3867C229.416 77.3867 229.409 77.3867 229.409 77.4247C229.405 77.4534 229.393 77.4805 229.375 77.503C229.357 77.5255 229.333 77.5425 229.306 77.5523C229.279 77.5621 229.25 77.5642 229.222 77.5584C229.194 77.5526 229.168 77.5392 229.147 77.5195V77.5309ZM229.3 77.4626C229.345 77.436 229.349 77.3677 229.3 77.2918C229.251 77.2159 229.255 77.2273 229.154 77.2918C229.053 77.3563 229.075 77.3411 229.094 77.3791C229.147 77.4816 229.21 77.5082 229.293 77.4664L229.3 77.4626ZM229.532 77.2728C229.559 77.2463 229.559 77.2311 229.532 77.1817C229.506 77.1324 229.502 77.121 229.491 77.1172C229.429 77.1291 229.37 77.1579 229.323 77.2007C229.323 77.2007 229.323 77.2425 229.364 77.2728C229.405 77.3032 229.469 77.3374 229.525 77.2728H229.532ZM231.47 77.5575C231.436 77.5347 231.47 77.4626 231.586 77.3336C231.616 77.3032 231.644 77.2702 231.668 77.2349L231.604 77.1969C231.533 77.159 231.477 77.083 231.496 77.0527C231.515 77.0223 231.698 77.0527 231.773 77.0792C231.804 77.0962 231.83 77.121 231.848 77.1514C231.872 77.1886 231.906 77.2187 231.945 77.2387C232.005 77.269 232.017 77.2842 232.002 77.3108C231.933 77.3975 231.848 77.4686 231.751 77.5195C231.663 77.5626 231.565 77.5759 231.47 77.5575V77.5575ZM234.965 77.5385C234.86 77.5032 234.768 77.4372 234.699 77.3487C234.647 77.2804 234.651 77.2614 234.726 77.2349C234.762 77.2232 234.794 77.1991 234.816 77.1665C234.832 77.135 234.855 77.1077 234.883 77.0868C234.939 77.0451 235.145 77.0185 235.164 77.0527C235.183 77.0868 235.123 77.1665 235.055 77.2007L234.992 77.2349C235.01 77.2612 235.032 77.2854 235.055 77.307C235.149 77.4019 235.235 77.5423 235.205 77.5575C235.13 77.5679 235.054 77.5532 234.988 77.5157L234.965 77.5385ZM233.163 77.3715C232.466 77.2576 231.919 76.5896 231.747 75.6483C231.706 75.3206 231.706 74.989 231.747 74.6614C231.826 74.1569 232.056 73.6892 232.406 73.3215C232.548 73.1963 232.707 73.0927 232.878 73.0141C233.05 72.9509 233.232 72.9238 233.414 72.9344C233.565 72.9402 233.714 72.9791 233.849 73.0482C234.129 73.2018 234.369 73.4187 234.553 73.682C234.736 73.9454 234.857 74.2481 234.905 74.5665C234.956 74.9443 234.956 75.3274 234.905 75.7052C234.737 76.5517 234.246 77.1817 233.628 77.3449C233.473 77.381 233.314 77.3912 233.156 77.3753L233.163 77.3715ZM233.65 77.1779C234.257 76.9919 234.714 76.2822 234.793 75.4054C234.89 74.335 234.37 73.3253 233.613 73.128C233.421 73.0805 233.22 73.0805 233.028 73.128C232.346 73.3405 231.867 74.1794 231.867 75.1586C231.854 75.4671 231.902 75.7751 232.008 76.0645C232.114 76.354 232.276 76.619 232.485 76.8439C232.67 77.0444 232.915 77.1777 233.182 77.2235C233.347 77.2428 233.515 77.2247 233.673 77.1703L233.65 77.1779ZM233.148 77.0603C232.905 77.0071 232.931 76.9995 233.332 76.9995C233.733 76.9995 233.774 76.9995 233.527 77.0641C233.404 77.0962 233.275 77.0962 233.152 77.0641L233.148 77.0603ZM232.68 76.7908L232.627 76.7452H234.055L234.01 76.7908L233.969 76.8363H232.736L232.68 76.7908ZM232.481 76.5782C232.469 76.565 232.458 76.5496 232.451 76.5327C232.565 76.5244 232.679 76.5244 232.792 76.5327H233.129L233.107 76.5782L233.088 76.6238H232.8C232.545 76.6238 232.507 76.6238 232.481 76.5896V76.5782ZM233.231 76.5479C233.26 76.4937 233.267 76.4303 233.251 76.3709C233.235 76.3115 233.197 76.2607 233.144 76.229C233.111 76.2118 233.074 76.2055 233.037 76.2109C233 76.2164 232.965 76.2333 232.938 76.2594C232.89 76.3125 232.875 76.3049 232.875 76.2328C232.872 76.204 232.875 76.1749 232.885 76.1476C232.894 76.1203 232.91 76.0955 232.93 76.0748C232.95 76.0542 232.974 76.0383 233.001 76.0282C233.027 76.0181 233.056 76.0141 233.084 76.0165C233.133 76.0165 233.156 76.0165 233.197 76.081C233.238 76.1455 233.283 76.1493 233.227 76.0354C233.182 75.9512 233.164 75.8552 233.175 75.7603C233.186 75.6654 233.225 75.576 233.287 75.504L233.351 75.4319L233.388 75.4775C233.462 75.5744 233.509 75.6898 233.523 75.8115C233.519 75.8786 233.503 75.9443 233.474 76.0051C233.418 76.1341 233.422 76.1645 233.474 76.0772C233.487 76.0558 233.507 76.0388 233.529 76.028C233.552 76.0173 233.577 76.0133 233.602 76.0165C233.644 76.0141 233.687 76.0268 233.722 76.0524C233.756 76.0779 233.782 76.1148 233.793 76.1569C233.8 76.1933 233.8 76.2306 233.793 76.267V76.3163L233.748 76.2708C233.717 76.2397 233.676 76.2202 233.633 76.2152C233.589 76.2102 233.546 76.2201 233.509 76.2433C233.472 76.2664 233.443 76.3016 233.428 76.343C233.413 76.3845 233.412 76.4299 233.425 76.4719C233.425 76.5137 233.452 76.563 233.459 76.582C233.467 76.601 233.459 76.6124 233.332 76.6124H233.193L233.231 76.5479ZM233.433 75.8153C233.433 75.7318 233.38 75.5534 233.354 75.5534C233.345 75.6379 233.345 75.7232 233.354 75.8077V76.0658L233.392 75.9823C233.415 75.9294 233.429 75.8729 233.433 75.8153V75.8153ZM233.594 76.5744C233.53 76.5137 233.564 76.5061 233.913 76.5061H234.25L234.22 76.5517C234.19 76.5972 234.19 76.5972 233.901 76.5972C233.798 76.6075 233.694 76.5998 233.594 76.5744V76.5744ZM232.328 76.3391C232.316 76.3246 232.309 76.3077 232.305 76.2897C232.382 76.2839 232.46 76.2839 232.537 76.2897C232.758 76.2897 232.77 76.2897 232.785 76.3353V76.377H232.56C232.354 76.377 232.331 76.377 232.313 76.3429L232.328 76.3391ZM232.983 76.3581C232.983 76.3353 233.025 76.3011 233.058 76.3011C233.083 76.3055 233.106 76.319 233.122 76.3391C233.152 76.3733 233.152 76.3733 233.069 76.3733C232.987 76.3733 232.983 76.3733 232.983 76.3733V76.3581ZM233.553 76.3581C233.553 76.3353 233.594 76.3011 233.628 76.3011C233.653 76.3055 233.675 76.319 233.691 76.3391C233.721 76.3733 233.721 76.3733 233.639 76.3733C233.557 76.3733 233.553 76.3733 233.553 76.3733V76.3581ZM233.901 76.3581C233.901 76.286 233.901 76.2822 234.152 76.2822C234.403 76.2822 234.415 76.2822 234.355 76.3543C234.21 76.3883 234.06 76.3973 233.913 76.3808L233.901 76.3581ZM232.223 76.1379C232.219 76.123 232.219 76.1073 232.223 76.0924C232.223 76.062 232.245 76.0582 232.507 76.0582C232.603 76.0511 232.699 76.0575 232.792 76.0772C232.792 76.1455 232.792 76.1531 232.507 76.1531C232.416 76.1618 232.325 76.1618 232.234 76.1531L232.223 76.1379ZM233.92 76.1379C233.923 76.1229 233.923 76.1074 233.92 76.0924C233.92 76.0658 233.943 76.062 234.205 76.062C234.467 76.062 234.501 76.062 234.493 76.0924C234.491 76.1074 234.491 76.1229 234.493 76.1379C234.402 76.1576 234.309 76.164 234.216 76.1569C234.124 76.1639 234.032 76.1575 233.943 76.1379H233.92ZM232.14 75.914C232.141 75.8988 232.141 75.8836 232.14 75.8684C232.14 75.8419 232.178 75.8381 232.597 75.8381C233.017 75.8381 233.069 75.8381 233.069 75.8646C233.069 75.8912 232.908 75.933 232.526 75.933C232.402 75.9467 232.276 75.9467 232.152 75.933L232.14 75.914ZM233.736 75.914C233.713 75.9083 233.689 75.9083 233.665 75.914C233.639 75.914 233.624 75.914 233.632 75.8912C233.639 75.8684 233.751 75.8646 234.1 75.8608H234.564V75.9026C234.564 75.9443 234.564 75.9443 234.167 75.9519C234.026 75.9633 233.885 75.9633 233.744 75.9519L233.736 75.914ZM232.077 75.6786C232.073 75.6637 232.073 75.6481 232.077 75.6331C232.244 75.6129 232.414 75.6065 232.582 75.6141H233.084V75.709H232.594C232.159 75.709 232.099 75.709 232.088 75.6786H232.077ZM233.62 75.6786C233.617 75.6636 233.617 75.6481 233.62 75.6331C233.788 75.6129 233.957 75.6065 234.126 75.6141H234.632V75.6559V75.7014H234.141C233.695 75.728 233.639 75.7242 233.632 75.6976L233.62 75.6786ZM232.043 75.4509C232.043 75.4281 232.043 75.4092 232.043 75.4016C232.043 75.394 233.204 75.4016 233.204 75.4016C233.198 75.4198 233.186 75.4356 233.171 75.4471C233.141 75.4737 233.073 75.4775 232.594 75.4775C232.114 75.4775 232.05 75.4775 232.043 75.4433V75.4509ZM233.519 75.4509C233.467 75.3788 233.455 75.3826 234.066 75.3826H234.654V75.4737H234.096C233.904 75.4904 233.71 75.4828 233.519 75.4509V75.4509ZM232.02 75.2042V75.1586H234.643V75.2004V75.2725H231.998L232.02 75.2042ZM232.02 74.9916C232.02 74.9575 232.02 74.9537 232.26 74.9537C232.5 74.9537 232.5 74.9537 232.481 74.9916C232.462 75.0296 232.44 75.0296 232.241 75.0296C232.043 75.0296 232.02 75.0296 232.02 74.9916ZM232.597 74.9916C232.609 74.956 232.617 74.9191 232.62 74.8816C232.628 74.8523 232.629 74.8214 232.624 74.7916C232.618 74.7617 232.606 74.7335 232.588 74.7092C232.569 74.685 232.546 74.6653 232.519 74.6517C232.492 74.6382 232.463 74.6311 232.433 74.631C232.373 74.631 232.279 74.6804 232.279 74.7108H232.26C232.26 74.7108 232.241 74.6728 232.241 74.6272C232.238 74.5985 232.242 74.5694 232.253 74.5428C232.265 74.5162 232.282 74.493 232.305 74.4754C232.32 74.4543 232.339 74.437 232.361 74.4251C232.384 74.4132 232.409 74.4069 232.434 74.4069C232.46 74.4069 232.485 74.4132 232.507 74.4251C232.53 74.437 232.549 74.4543 232.564 74.4754C232.639 74.5589 232.642 74.5475 232.564 74.3881C232.53 74.3213 232.517 74.246 232.526 74.1718C232.544 74.0555 232.593 73.9464 232.669 73.8567C232.695 73.8302 232.702 73.834 232.755 73.8909C232.835 73.991 232.879 74.1152 232.882 74.2439C232.87 74.3042 232.852 74.3628 232.826 74.4185C232.8 74.4754 232.781 74.5286 232.788 74.5362C232.796 74.5437 232.807 74.5362 232.818 74.5096C232.829 74.4865 232.843 74.466 232.862 74.4493C232.881 74.4326 232.903 74.4203 232.927 74.4131C232.951 74.4058 232.976 74.4039 233 74.4075C233.025 74.4111 233.049 74.42 233.069 74.4337C233.148 74.4754 233.204 74.6197 233.167 74.6804C233.129 74.7411 233.144 74.6994 233.126 74.6804C233.099 74.6572 233.068 74.638 233.036 74.6235C233.017 74.6104 232.995 74.6034 232.972 74.6034C232.949 74.6034 232.927 74.6104 232.908 74.6235C232.864 74.6467 232.829 74.6841 232.807 74.7297C232.773 74.7943 232.773 74.8094 232.807 74.9005L232.833 75.003H232.706C232.594 75.003 232.579 75.003 232.59 74.9689L232.597 74.9916ZM232.8 74.2325C232.799 74.1686 232.786 74.1055 232.762 74.0465L232.721 73.963V74.5134L232.762 74.4299C232.791 74.3767 232.81 74.3189 232.818 74.2591L232.8 74.2325ZM232.95 74.9916V74.9537C232.95 74.9537 233.133 74.9537 233.354 74.9537C233.755 74.9537 233.759 74.9537 233.729 74.9916C233.699 75.0296 233.691 75.0296 233.336 75.0296C232.98 75.0296 232.98 75.0562 232.968 75.0296L232.95 74.9916ZM233.849 74.9916C233.873 74.9112 233.873 74.8253 233.849 74.7449C233.834 74.7113 233.81 74.6826 233.779 74.6625C233.749 74.6423 233.713 74.6314 233.676 74.631C233.617 74.631 233.519 74.6804 233.519 74.7108H233.5C233.5 74.7108 233.482 74.6728 233.482 74.6272C233.479 74.5986 233.484 74.5697 233.495 74.5432C233.506 74.5167 233.523 74.4934 233.545 74.4754C233.56 74.4543 233.579 74.437 233.602 74.4251C233.624 74.4132 233.649 74.4069 233.675 74.4069C233.7 74.4069 233.725 74.4132 233.748 74.4251C233.77 74.437 233.789 74.4543 233.804 74.4754C233.879 74.5589 233.883 74.5475 233.804 74.3881C233.767 74.3057 233.756 74.2141 233.77 74.125C233.785 74.0359 233.825 73.9531 233.886 73.8871L233.931 73.8264L233.984 73.8757C234.02 73.9208 234.05 73.9706 234.074 74.0237C234.102 74.0828 234.117 74.1477 234.117 74.2135C234.117 74.2793 234.102 74.3443 234.074 74.4033C234.052 74.4404 234.039 74.4819 234.036 74.5248C234.036 74.5248 234.055 74.5248 234.066 74.4982C234.076 74.4751 234.091 74.4546 234.11 74.4379C234.129 74.4212 234.151 74.4089 234.174 74.4017C234.198 74.3945 234.223 74.3926 234.248 74.3961C234.273 74.3997 234.296 74.4086 234.317 74.4223C234.358 74.4466 234.39 74.484 234.408 74.5287C234.425 74.5734 234.428 74.6228 234.415 74.669C234.415 74.688 234.392 74.688 234.373 74.669C234.347 74.6466 234.318 74.6275 234.287 74.6121C234.268 74.5992 234.245 74.5923 234.222 74.5923C234.198 74.5923 234.176 74.5992 234.156 74.6121C234.112 74.6354 234.076 74.6727 234.055 74.7183C234.021 74.7829 234.021 74.7981 234.055 74.8891L234.085 74.9916H233.954C233.841 74.9916 233.83 74.9916 233.841 74.9575L233.849 74.9916ZM234.047 74.2135C234.05 74.149 234.035 74.085 234.006 74.0275L233.969 73.9554V74.5134L234.01 74.4299C234.041 74.3738 234.06 74.3117 234.066 74.2477L234.047 74.2135ZM234.197 74.9954V74.9575C234.277 74.9527 234.357 74.9527 234.437 74.9575C234.662 74.9575 234.677 74.9575 234.677 74.9954C234.677 75.0334 234.677 75.0334 234.448 75.0334C234.22 75.0334 234.22 75.0334 234.209 75.003L234.197 74.9954ZM232.035 74.7639C232.035 74.7373 232.058 74.7259 232.095 74.7259C232.133 74.7259 232.148 74.7259 232.155 74.7639C232.163 74.8018 232.155 74.8018 232.095 74.8018C232.035 74.8018 232.043 74.8322 232.054 74.7981L232.035 74.7639ZM232.369 74.7639C232.386 74.7475 232.409 74.738 232.433 74.7373C232.457 74.7381 232.481 74.7475 232.5 74.7639C232.519 74.7905 232.5 74.7943 232.433 74.7943C232.365 74.7943 232.369 74.8322 232.388 74.8056L232.369 74.7639ZM232.923 74.7639C232.923 74.7259 233.04 74.7221 233.066 74.7639C233.092 74.8056 233.066 74.7943 233.002 74.7943C232.938 74.7943 232.938 74.8284 232.942 74.8132L232.923 74.7639ZM233.276 74.7639C233.277 74.7513 233.277 74.7385 233.276 74.7259C233.293 74.7217 233.311 74.7217 233.328 74.7259C233.365 74.7259 233.384 74.7259 233.392 74.7639C233.399 74.8018 233.392 74.8018 233.328 74.8018C233.264 74.8018 233.257 74.8018 233.264 74.7715L233.276 74.7639ZM233.62 74.7639C233.629 74.7554 233.639 74.7487 233.65 74.7442C233.66 74.7396 233.672 74.7373 233.684 74.7373C233.708 74.738 233.73 74.7475 233.748 74.7639C233.766 74.7905 233.748 74.7943 233.684 74.7943C233.62 74.7943 233.617 74.8322 233.639 74.8056L233.62 74.7639ZM234.175 74.7639C234.175 74.7259 234.287 74.7221 234.313 74.7639C234.34 74.8056 234.313 74.7943 234.254 74.7943C234.194 74.7943 234.179 74.8284 234.179 74.8132L234.175 74.7639ZM234.527 74.7639V74.7259C234.527 74.7259 234.55 74.7259 234.579 74.7259C234.609 74.7259 234.636 74.7259 234.636 74.7639C234.636 74.8018 234.636 74.8018 234.568 74.8018C234.501 74.8018 234.553 74.8284 234.553 74.8056L234.527 74.7639ZM232.065 74.5437C232.065 74.5248 232.065 74.5096 232.065 74.502C232.065 74.4944 232.065 74.502 232.103 74.502C232.14 74.502 232.14 74.5665 232.084 74.5741C232.028 74.5817 232.043 74.5741 232.054 74.5513L232.065 74.5437ZM233.283 74.5437C233.283 74.5134 233.283 74.5058 233.336 74.5058C233.388 74.5058 233.399 74.5058 233.395 74.5399C233.392 74.5741 233.294 74.5931 233.283 74.5399V74.5437ZM234.531 74.5437C234.531 74.5134 234.531 74.5058 234.561 74.5096C234.571 74.5115 234.58 74.516 234.588 74.5226C234.596 74.5293 234.602 74.5378 234.606 74.5475C234.606 74.5969 234.542 74.5931 234.531 74.5475V74.5437ZM232.122 74.3464C232.123 74.3312 232.123 74.316 232.122 74.3008C232.17 74.2911 232.219 74.2911 232.268 74.3008C232.316 74.2927 232.365 74.2927 232.414 74.3008C232.414 74.3274 232.238 74.3805 232.166 74.3805C232.095 74.3805 232.099 74.3805 232.11 74.3502L232.122 74.3464ZM233.073 74.3464C233.028 74.3464 232.995 74.3122 232.995 74.3008C233.107 74.2926 233.22 74.2926 233.332 74.3008C233.445 74.2925 233.559 74.2925 233.673 74.3008C233.647 74.3238 233.616 74.3407 233.583 74.3502C233.423 74.3964 233.255 74.4042 233.092 74.3729L233.073 74.3464ZM234.321 74.3464C234.291 74.3395 234.263 74.3237 234.242 74.3008C234.292 74.2915 234.343 74.2915 234.392 74.3008C234.535 74.3008 234.546 74.3008 234.549 74.3464C234.553 74.3919 234.549 74.3881 234.478 74.3843C234.432 74.3864 234.385 74.3826 234.34 74.3729L234.321 74.3464ZM232.204 74.1186C232.204 74.0807 232.234 74.0731 232.331 74.0693C232.429 74.0655 232.448 74.0693 232.44 74.1072C232.433 74.1452 232.44 74.149 232.309 74.1528C232.178 74.1566 232.185 74.1528 232.2 74.1186H232.204ZM232.995 74.1414C232.998 74.1264 232.998 74.1109 232.995 74.0959C232.995 74.0693 233.021 74.0655 233.343 74.0655H233.718V74.1072C233.718 74.149 233.718 74.149 233.369 74.1528C233.255 74.1665 233.139 74.1665 233.025 74.1528L232.995 74.1414ZM234.242 74.1414C234.245 74.1264 234.245 74.1109 234.242 74.0959C234.242 74.0693 234.242 74.0655 234.351 74.0655C234.392 74.0563 234.434 74.0563 234.475 74.0655C234.472 74.0818 234.472 74.0985 234.475 74.1148C234.475 74.1376 234.475 74.1414 234.362 74.1414C234.323 74.1504 234.282 74.1504 234.242 74.1414ZM232.305 73.9478C232.307 73.9294 232.315 73.9122 232.328 73.8985C232.346 73.8719 232.373 73.8681 232.466 73.8719H232.579L232.552 73.9137C232.526 73.9516 232.504 73.9592 232.414 73.9592C232.378 73.9684 232.341 73.9684 232.305 73.9592V73.9478ZM232.905 73.9288C232.89 73.9155 232.88 73.8984 232.875 73.8795C233.034 73.8711 233.194 73.8711 233.354 73.8795H233.834L233.804 73.9213C233.778 73.963 233.77 73.963 233.354 73.9668C232.938 73.9706 232.931 73.9668 232.905 73.9402V73.9288ZM234.145 73.9288C234.134 73.9153 234.127 73.8998 234.122 73.8833C234.122 73.8605 234.336 73.8833 234.355 73.8833C234.373 73.8833 234.381 73.9554 234.272 73.9554C234.164 73.9554 234.164 73.9554 234.145 73.9175V73.9288ZM232.451 73.7277C232.456 73.7104 232.465 73.6946 232.477 73.6821C232.5 73.6518 232.556 73.648 233.351 73.6518H234.201L234.227 73.6935L234.254 73.7353H233.354C232.856 73.7353 232.451 73.7353 232.451 73.7353V73.7277ZM232.676 73.4734L232.729 73.424H233.969L234.01 73.4734L234.055 73.5189H232.624L232.676 73.4734ZM232.991 73.2798C233.11 73.2305 233.237 73.2047 233.365 73.2039C233.482 73.207 233.598 73.2315 233.706 73.276C233.729 73.276 233.609 73.295 233.365 73.295C233.241 73.3068 233.115 73.3068 232.991 73.295V73.2798ZM231.256 77.2842C231.2 77.2614 231.204 77.2425 231.256 77.2045C231.289 77.1841 231.328 77.1733 231.367 77.1733C231.405 77.1733 231.444 77.1841 231.477 77.2045C231.507 77.2349 231.507 77.2387 231.477 77.2728C231.444 77.2918 231.406 77.3017 231.368 77.3017C231.33 77.3017 231.293 77.2918 231.26 77.2728L231.256 77.2842ZM235.246 77.2842C235.183 77.2463 235.183 77.2235 235.246 77.1893C235.281 77.1742 235.319 77.1691 235.356 77.1744C235.393 77.1798 235.427 77.1955 235.456 77.2197L235.501 77.2538L235.445 77.2842C235.412 77.3009 235.375 77.3096 235.338 77.3096C235.301 77.3096 235.265 77.3009 235.231 77.2842H235.246ZM232.013 77.0944C231.893 76.9464 231.844 76.9084 231.736 76.9009H231.683L231.747 76.8667L231.814 76.8287C231.833 76.8287 231.679 76.5896 231.623 76.5403C231.567 76.4909 231.515 76.4719 231.451 76.5403C231.413 76.5655 231.368 76.5775 231.323 76.5744C231.207 76.5744 231.185 76.5554 231.237 76.5061C231.275 76.4594 231.325 76.4253 231.382 76.4084C231.439 76.3915 231.499 76.3924 231.556 76.4112L231.631 76.434C231.587 76.3043 231.536 76.1775 231.477 76.0544C231.432 75.9747 231.29 75.8343 231.267 75.8457C231.19 75.9016 231.096 75.9308 231.001 75.9292C230.919 75.9292 230.78 75.8457 230.78 75.8153C230.78 75.7849 230.818 75.7773 230.863 75.7508C230.926 75.7134 230.999 75.6974 231.072 75.7052C231.149 75.7033 231.225 75.719 231.294 75.7512C231.364 75.7835 231.425 75.8313 231.473 75.8912C231.611 76.0308 231.722 76.1957 231.799 76.377C231.91 76.6197 232.062 76.8407 232.249 77.0299L232.418 77.2007H232.343C232.295 77.1966 232.248 77.1966 232.2 77.2007C232.133 77.2007 232.129 77.2007 232.009 77.0641L232.013 77.0944ZM234.396 77.2235H234.283L234.422 77.0868C234.609 76.9061 234.763 76.6927 234.875 76.4568C234.968 76.2536 235.094 76.0686 235.25 75.9102C235.324 75.8156 235.43 75.7515 235.547 75.7299C235.664 75.7082 235.785 75.7305 235.887 75.7925C235.943 75.8305 235.947 75.8305 235.917 75.8646C235.844 75.9196 235.757 75.9525 235.666 75.9595C235.619 75.9515 235.573 75.9348 235.531 75.9102L235.445 75.8646L235.393 75.9026C235.268 76.0163 235.178 76.1639 235.134 76.3277C235.089 76.4606 235.089 76.4643 235.164 76.4302C235.206 76.4115 235.251 76.4018 235.297 76.4018C235.343 76.4018 235.388 76.4115 235.43 76.4302C235.554 76.4947 235.542 76.5403 235.396 76.5441C235.35 76.5441 235.305 76.528 235.269 76.4985L235.22 76.453L235.149 76.4871C235.059 76.5451 234.988 76.6299 234.947 76.73L234.898 76.8136L234.977 76.8515L235.052 76.8857H234.962C234.875 76.8857 234.864 76.9046 234.726 77.0565C234.677 77.12 234.617 77.174 234.549 77.2159H234.407L234.396 77.2235ZM228.899 76.9084C228.866 76.8918 228.838 76.8681 228.815 76.8391C228.792 76.8101 228.775 76.7765 228.766 76.7404C228.758 76.7044 228.756 76.6668 228.763 76.6303C228.77 76.5938 228.784 76.5592 228.806 76.5289C228.872 76.4797 228.945 76.4401 229.023 76.4112C229.173 76.3505 229.195 76.3353 229.195 76.2973C229.195 76.2594 229.236 76.2594 229.278 76.3733C229.319 76.4871 229.311 76.5289 229.278 76.4606L229.251 76.4226L229.098 76.4795C228.91 76.5517 228.832 76.6238 228.851 76.6997C228.855 76.7348 228.87 76.7676 228.894 76.7939C228.917 76.8203 228.948 76.839 228.982 76.8477C229.055 76.8392 229.127 76.8214 229.195 76.7946C229.345 76.7338 229.356 76.73 229.356 76.6769C229.356 76.6238 229.394 76.6238 229.435 76.7376C229.476 76.8515 229.465 76.8743 229.413 76.8249C229.36 76.7756 229.371 76.7946 229.233 76.8477C229.034 76.9274 228.993 76.935 228.914 76.8933L228.899 76.9084ZM231.185 76.8857C231.151 76.8857 231.155 76.8857 231.215 76.806C231.292 76.736 231.392 76.6981 231.496 76.6997C231.578 76.6997 231.593 76.7263 231.548 76.7908C231.502 76.8423 231.442 76.8787 231.375 76.8956C231.308 76.9125 231.238 76.909 231.174 76.8857H231.185ZM235.261 76.8857C235.232 76.8747 235.206 76.857 235.186 76.8339C235.165 76.8108 235.15 76.783 235.142 76.7528C235.142 76.7225 235.142 76.7149 235.201 76.7111C235.249 76.7038 235.297 76.7038 235.344 76.7111C235.426 76.73 235.565 76.8477 235.542 76.8705C235.451 76.8984 235.354 76.8997 235.261 76.8743V76.8857ZM230.982 76.6997C230.953 76.6769 230.953 76.6731 231.009 76.6427C231.065 76.6124 231.267 76.6427 231.185 76.6997C231.153 76.7149 231.118 76.7218 231.082 76.7198C231.047 76.7179 231.013 76.707 230.982 76.6883V76.6997ZM235.52 76.6997C235.49 76.6655 235.494 76.6617 235.546 76.639C235.577 76.627 235.611 76.6236 235.644 76.6289C235.677 76.6342 235.708 76.6482 235.734 76.6693C235.752 76.6921 235.734 76.6997 235.734 76.7149C235.701 76.731 235.665 76.7393 235.629 76.7393C235.592 76.7393 235.556 76.731 235.524 76.7149L235.52 76.6997ZM230.941 76.3808L230.87 76.3543C230.851 76.3353 230.986 76.2214 231.054 76.1911C231.121 76.1607 231.102 76.1607 231.095 76.1455L231.072 76.0886C231.072 76.0658 231.072 76.062 231.095 76.0696L231.196 76.0886C231.282 76.0886 231.327 76.1569 231.32 76.2252C231.312 76.2935 231.08 76.4112 230.941 76.3619V76.3808ZM235.621 76.3808C235.34 76.3239 235.306 76.1189 235.569 76.0772C235.64 76.0772 235.655 76.0772 235.621 76.1379C235.587 76.1987 235.621 76.1759 235.689 76.2138C235.734 76.238 235.776 76.2687 235.812 76.3049C235.842 76.3391 235.842 76.3467 235.812 76.3619L235.756 76.3808H235.7C235.671 76.3866 235.642 76.3866 235.614 76.3808H235.621ZM228.907 76.2024C228.876 76.1668 228.852 76.1256 228.836 76.081C228.836 76.0203 228.802 76.0165 228.693 76.0468C228.584 76.0772 228.626 76.0734 228.629 76.1038C228.633 76.1341 228.629 76.1455 228.629 76.1493C228.629 76.1531 228.596 76.1038 228.581 76.0354C228.566 75.9671 228.581 75.8798 228.611 75.9443C228.641 76.0089 228.656 75.9671 228.862 75.9178C229.068 75.8684 229.09 75.8608 229.094 75.8229C229.098 75.7849 229.132 75.7849 229.169 75.9405C229.206 76.0962 229.203 76.1797 229.139 76.2328C229.123 76.2466 229.105 76.2567 229.085 76.2627C229.065 76.2687 229.044 76.2703 229.024 76.2674C229.003 76.2645 228.983 76.2572 228.966 76.246C228.948 76.2348 228.933 76.22 228.922 76.2024H228.907ZM229.079 76.1455C229.093 76.136 229.104 76.1229 229.111 76.1076C229.119 76.0922 229.122 76.0752 229.12 76.0582C229.12 75.9595 229.12 75.9481 228.985 75.9747C228.851 76.0013 228.88 75.9937 228.888 76.0506C228.91 76.1645 228.997 76.2062 229.079 76.1455ZM235.074 75.9254C235.121 75.7192 235.152 75.5099 235.168 75.2991C235.177 75.0122 235.15 74.7253 235.089 74.4451C234.988 73.9858 235.048 73.7504 235.291 73.6252C235.34 73.5995 235.391 73.5815 235.445 73.5721C235.486 73.5721 235.49 73.5721 235.479 73.6328C235.455 73.7306 235.4 73.8175 235.321 73.8795C235.282 73.8985 235.24 73.9125 235.198 73.9213H235.13V74.0617C235.125 74.1047 235.128 74.1484 235.139 74.1902C235.151 74.232 235.171 74.2709 235.198 74.3046C235.237 74.3602 235.282 74.4111 235.333 74.4564C235.393 74.502 235.4 74.5058 235.43 74.4792C235.489 74.4441 235.557 74.4296 235.625 74.4378C235.693 74.4461 235.756 74.4766 235.805 74.5248C235.853 74.5703 235.861 74.5817 235.835 74.5969C235.772 74.6304 235.703 74.6498 235.632 74.6538C235.521 74.6402 235.414 74.6027 235.318 74.5437C235.22 74.4792 235.22 74.483 235.25 74.6386L235.273 74.7449H235.366H235.46L235.404 74.7753C235.364 74.7972 235.332 74.8316 235.313 74.8734C235.294 74.9151 235.289 74.9619 235.299 75.0068V75.0562L235.393 74.9954C235.462 74.9452 235.543 74.9138 235.627 74.9045C235.712 74.8952 235.798 74.9082 235.876 74.9423C235.91 74.9689 235.91 74.9727 235.876 75.0144C235.832 75.0531 235.778 75.0792 235.721 75.0899C235.664 75.1006 235.605 75.0955 235.55 75.0751L235.43 75.041L235.389 75.0941C235.357 75.1329 235.333 75.1785 235.321 75.2275C235.308 75.2765 235.306 75.3278 235.316 75.3775C235.325 75.4273 235.345 75.4744 235.375 75.5153C235.404 75.5562 235.442 75.59 235.486 75.6141C235.539 75.6407 235.539 75.6407 235.449 75.6331C235.407 75.631 235.366 75.6247 235.325 75.6141C235.299 75.6141 235.291 75.6141 235.284 75.69C235.276 75.7659 235.254 75.7963 235.164 75.895L235.059 76.0127L235.082 75.9292L235.074 75.9254ZM231.533 75.8874C231.479 75.8382 231.443 75.771 231.432 75.6976C231.432 75.6217 231.413 75.6065 231.383 75.6141H231.256H231.162L231.245 75.5724C231.294 75.5483 231.334 75.51 231.361 75.4623C231.383 75.4101 231.395 75.354 231.395 75.2972C231.395 75.2404 231.383 75.1842 231.361 75.1321C231.305 75.0182 231.286 75.0106 231.177 75.0448C231.126 75.0643 231.071 75.0715 231.016 75.0655C230.961 75.0596 230.909 75.0408 230.863 75.0106C230.773 74.9499 230.784 74.9195 230.904 74.8891C230.973 74.8722 231.045 74.8709 231.115 74.8853C231.185 74.8997 231.251 74.9296 231.308 74.9727C231.34 74.9972 231.374 75.0188 231.41 75.0372C231.414 75.0121 231.414 74.9863 231.41 74.9613C231.412 74.9192 231.403 74.8773 231.384 74.8399C231.365 74.8026 231.336 74.7711 231.301 74.7487C231.252 74.7183 231.252 74.7183 231.342 74.7259H231.432L231.455 74.6045C231.455 74.5362 231.473 74.4792 231.473 74.4792C231.442 74.4908 231.413 74.5074 231.387 74.5286C231.326 74.5662 231.261 74.5955 231.192 74.6159C231.123 74.6405 231.048 74.6405 230.979 74.6159C230.844 74.5855 230.821 74.5551 230.893 74.5058C230.938 74.4604 230.997 74.4305 231.06 74.4202C231.123 74.41 231.188 74.42 231.245 74.4489L231.312 74.483L231.387 74.4185C231.453 74.3631 231.506 74.2926 231.539 74.2127C231.573 74.1329 231.588 74.0459 231.582 73.9592C231.582 73.9023 231.582 73.8909 231.526 73.8909C231.449 73.8816 231.377 73.8469 231.321 73.792C231.266 73.737 231.23 73.6651 231.219 73.5872C231.219 73.5265 231.219 73.5227 231.353 73.5645C231.443 73.5944 231.521 73.6525 231.575 73.7304C231.63 73.8082 231.658 73.9017 231.657 73.9972C231.664 74.1369 231.648 74.2768 231.608 74.4109C231.511 74.8738 231.511 75.3524 231.608 75.8153C231.624 75.8591 231.632 75.9054 231.631 75.9519C231.593 75.923 231.56 75.8899 231.53 75.8532L231.533 75.8874ZM231.009 75.5268C230.971 75.5003 231.009 75.4357 231.087 75.413C231.166 75.3902 231.252 75.413 231.237 75.4433V75.4775C231.208 75.5044 231.172 75.5232 231.133 75.5318C231.094 75.5405 231.054 75.5387 231.016 75.5268H231.009ZM235.505 75.4889L235.445 75.4319L235.497 75.413C235.534 75.4015 235.573 75.4012 235.61 75.412C235.646 75.4228 235.679 75.4442 235.704 75.4737C235.737 75.523 235.704 75.542 235.625 75.542C235.58 75.5391 235.538 75.5203 235.505 75.4889V75.4889ZM228.487 75.4889C228.484 75.4459 228.484 75.4028 228.487 75.3598C228.487 75.2497 228.487 75.2232 228.532 75.2915C228.577 75.3598 228.562 75.3294 228.738 75.3181C228.989 75.3181 229.027 75.2953 229.027 75.2497C229.027 75.2042 229.027 75.2156 229.027 75.2156C229.027 75.2156 229.064 75.2649 229.064 75.3636C229.064 75.4623 229.042 75.4851 229.019 75.4167C228.997 75.3484 229.019 75.375 228.644 75.4167C228.547 75.4167 228.525 75.4167 228.525 75.4623C228.525 75.5078 228.491 75.5268 228.48 75.4927L228.487 75.4889ZM230.758 75.3067C230.698 75.2687 230.698 75.2687 230.728 75.2308C230.78 75.1863 230.847 75.1619 230.915 75.1619C230.984 75.1619 231.05 75.1863 231.102 75.2308L231.144 75.2649L231.08 75.3067C231.033 75.3319 230.98 75.3451 230.926 75.3451C230.873 75.3451 230.82 75.3319 230.773 75.3067H230.758ZM235.651 75.3067C235.591 75.2763 235.591 75.2611 235.651 75.2194C235.7 75.1809 235.76 75.16 235.822 75.16C235.883 75.16 235.943 75.1809 235.992 75.2194C236.022 75.2573 236.022 75.2573 235.962 75.2953C235.915 75.3156 235.865 75.3262 235.814 75.3262C235.763 75.3262 235.713 75.3156 235.666 75.2953L235.651 75.3067ZM228.652 75.0941C228.578 75.0673 228.518 75.0132 228.482 74.9426C228.447 74.8721 228.439 74.7906 228.461 74.7145C228.476 74.6696 228.502 74.6288 228.535 74.5954C228.569 74.562 228.609 74.537 228.654 74.5223C228.699 74.5076 228.746 74.5036 228.793 74.5106C228.839 74.5176 228.883 74.5354 228.922 74.5627C228.961 74.589 228.993 74.6248 229.016 74.6668C229.038 74.7089 229.05 74.7559 229.05 74.8037C229.05 74.8515 229.038 74.8986 229.016 74.9407C228.993 74.9827 228.961 75.0185 228.922 75.0448C228.841 75.0951 228.745 75.1128 228.652 75.0941V75.0941ZM228.847 75.003C228.881 74.9929 228.913 74.9745 228.939 74.9494C228.965 74.9243 228.985 74.8932 228.997 74.8588C229.002 74.8192 228.995 74.779 228.978 74.7432C228.961 74.7074 228.933 74.6776 228.899 74.6576C228.843 74.6319 228.78 74.6239 228.719 74.6348C228.618 74.6348 228.596 74.6348 228.558 74.6918C228.535 74.7228 228.52 74.7596 228.516 74.7983C228.511 74.8369 228.517 74.8762 228.532 74.9119C228.563 74.947 228.601 74.9742 228.644 74.9914C228.687 75.0085 228.733 75.0151 228.779 75.0106H228.847V75.003ZM228.97 74.4489C228.922 74.4489 228.929 74.3881 228.97 74.3881C229.012 74.3881 229.015 74.3881 229.023 74.3312C229.045 74.2173 229.042 74.2059 228.952 74.1907C228.921 74.1845 228.889 74.1845 228.858 74.1907C228.846 74.2159 228.839 74.2428 228.836 74.2705C228.836 74.3084 228.813 74.3426 228.798 74.3464C228.783 74.3502 228.776 74.3464 228.798 74.2629V74.168H228.734H228.618C228.577 74.168 228.569 74.168 228.558 74.2059C228.547 74.2439 228.54 74.2515 228.528 74.2515C228.517 74.2515 228.528 74.149 228.528 74.0351C228.528 73.9782 228.566 73.9782 228.573 74.0351C228.581 74.0921 228.596 74.0769 228.806 74.111C229.015 74.1452 229.034 74.1414 229.057 74.111C229.079 74.0807 229.113 74.0845 229.09 74.2439C229.068 74.483 229.072 74.4792 228.97 74.4489V74.4489ZM231.125 74.2932C231.076 74.2667 231.076 74.2515 231.125 74.2135C231.157 74.1959 231.193 74.1867 231.23 74.1867C231.266 74.1867 231.302 74.1959 231.335 74.2135C231.368 74.2401 231.368 74.2439 231.335 74.2705C231.304 74.2905 231.269 74.303 231.232 74.3069C231.196 74.3109 231.159 74.3062 231.125 74.2932V74.2932ZM235.396 74.2932C235.366 74.2932 235.344 74.2591 235.344 74.2477C235.344 74.2363 235.411 74.1907 235.479 74.1907C235.546 74.1907 235.64 74.2515 235.61 74.2856C235.577 74.3026 235.54 74.3115 235.503 74.3115C235.466 74.3115 235.429 74.3026 235.396 74.2856V74.2932ZM230.926 74.0769C230.9 74.0769 230.885 74.0503 230.885 74.0427C230.885 74.0351 230.93 74.001 230.99 73.9744C231.05 73.9478 231.099 73.9213 231.076 73.8757C231.061 73.8516 231.052 73.8243 231.05 73.796C231.05 73.7694 231.05 73.7694 231.099 73.796C231.147 73.8226 231.234 73.8871 231.234 73.9326C231.235 73.961 231.244 73.9885 231.26 74.0123C231.286 74.0503 231.286 74.0541 231.234 74.0807C231.132 74.1093 231.025 74.1053 230.926 74.0693V74.0769ZM235.486 74.0769C235.43 74.0769 235.423 74.0237 235.464 73.9858C235.505 73.9478 235.49 73.9554 235.486 73.944C235.482 73.9326 235.512 73.8377 235.584 73.7998L235.655 73.7618V73.8074C235.653 73.8353 235.645 73.8625 235.632 73.8871C235.606 73.9213 235.61 73.925 235.715 73.9706C235.754 73.9881 235.791 74.0111 235.823 74.0389C235.823 74.0921 235.595 74.1186 235.486 74.0769V74.0769ZM231.739 73.9744C231.709 73.925 231.739 73.8188 231.788 73.6821C231.821 73.6102 231.848 73.5352 231.867 73.4582C231.867 73.3861 231.867 73.3823 231.796 73.3329C231.745 73.3018 231.704 73.2567 231.677 73.203C231.651 73.1493 231.64 73.089 231.646 73.0293C231.643 72.9804 231.65 72.9316 231.664 72.885C231.664 72.8547 231.691 72.8547 231.773 72.9116C231.831 72.9524 231.88 73.0039 231.919 73.0634C231.966 73.1349 231.986 73.2212 231.975 73.3064C231.977 73.3884 231.967 73.4702 231.945 73.5493C231.895 73.6971 231.826 73.8375 231.739 73.9668V73.9744ZM234.902 73.8681C234.703 73.4885 234.677 73.2229 234.808 73.0369C234.872 72.9496 235.014 72.8471 235.04 72.8699C235.058 72.913 235.066 72.9598 235.063 73.0065C235.074 73.0755 235.062 73.1464 235.029 73.2077C234.988 73.2831 234.923 73.343 234.846 73.3785C234.819 73.3785 234.846 73.5417 234.932 73.7049C235.018 73.8681 234.995 73.8567 234.98 73.9213V73.9972L234.902 73.8681ZM228.851 73.5948C228.839 73.5826 228.831 73.5673 228.828 73.5506C228.825 73.5339 228.826 73.5166 228.833 73.5009C228.839 73.4852 228.85 73.4717 228.864 73.4621C228.877 73.4525 228.894 73.4472 228.91 73.4468C228.931 73.4467 228.951 73.4545 228.966 73.4685C228.982 73.4826 228.991 73.5019 228.993 73.5227C228.993 73.5332 228.992 73.5436 228.988 73.5535C228.985 73.5634 228.979 73.5725 228.973 73.5802C228.966 73.588 228.957 73.5943 228.948 73.5987C228.938 73.6032 228.928 73.6057 228.918 73.6062V73.6062C228.894 73.609 228.87 73.6022 228.851 73.5872V73.5948ZM231.548 73.5113C231.515 73.4908 231.487 73.4625 231.467 73.4288C231.447 73.3952 231.435 73.3571 231.432 73.3177C231.432 73.2722 231.455 73.2722 231.537 73.3177C231.57 73.3379 231.597 73.3656 231.617 73.3986C231.638 73.4315 231.65 73.4689 231.653 73.5075C231.653 73.5417 231.631 73.5417 231.556 73.5037L231.548 73.5113ZM235.052 73.5113C235.061 73.4449 235.09 73.3828 235.134 73.3329C235.16 73.3138 235.189 73.2996 235.22 73.2912C235.269 73.2912 235.273 73.2912 235.273 73.3367C235.27 73.3751 235.257 73.4121 235.236 73.4436C235.214 73.475 235.184 73.4998 235.149 73.5151C235.07 73.5417 235.052 73.5417 235.052 73.5037V73.5113ZM232.155 73.2266C232.181 73.1014 232.133 72.9647 231.934 72.5776C231.736 72.1904 231.717 72.1221 231.848 72.198C231.908 72.2322 231.912 72.2322 232.005 72.198C232.043 72.1803 232.082 72.1663 232.122 72.1563C232.122 72.1563 232.159 72.1904 232.181 72.2322C232.238 72.3309 232.298 72.3612 232.361 72.3157C232.425 72.2701 232.41 72.2777 232.399 72.198C232.373 72.0348 232.365 72.0462 232.534 71.9741L232.725 71.8906C232.747 71.8906 232.762 71.8906 232.788 71.9589C232.815 72.0272 232.89 72.1107 232.946 72.0955C233.002 72.0804 233.04 72.0196 233.013 71.8944C233.013 71.8336 232.991 71.7805 233.013 71.7805C233.134 71.7219 233.259 71.6736 233.388 71.6363C233.456 71.6544 233.523 71.6785 233.587 71.7084C233.714 71.7653 233.748 71.7881 233.748 71.8147C233.748 71.8412 233.748 71.8944 233.748 71.9475C233.748 72.0006 233.748 72.0424 233.785 72.0728C233.823 72.1031 233.913 72.0728 233.969 71.9741L234.017 71.8792L234.167 71.9475L234.362 72.031C234.392 72.031 234.403 72.0538 234.392 72.0804C234.381 72.1189 234.374 72.1582 234.37 72.198C234.37 72.2739 234.37 72.2853 234.411 72.3157C234.452 72.3461 234.535 72.3157 234.583 72.2322C234.606 72.1904 234.636 72.1563 234.647 72.1563C234.691 72.1675 234.733 72.1828 234.774 72.2018C234.875 72.2474 234.875 72.2474 234.909 72.2018C234.943 72.1563 234.992 72.1525 235.014 72.1752C234.964 72.3063 234.904 72.4332 234.834 72.5548C234.639 72.9344 234.591 73.0862 234.609 73.2115V73.276L234.486 73.1583C234.423 73.095 234.355 73.0367 234.283 72.9837C234.254 72.9679 234.229 72.9459 234.209 72.9192C234.26 72.868 234.318 72.8246 234.381 72.7901C234.381 72.7901 234.381 72.8091 234.381 72.8319C234.381 72.8547 234.411 72.9192 234.441 72.9192C234.471 72.9192 234.486 72.8774 234.512 72.8281C234.538 72.7788 234.576 72.737 234.407 72.6383C234.14 72.4844 233.844 72.39 233.538 72.3612C233.459 72.3612 233.44 72.3347 233.482 72.2891C233.523 72.2436 234.265 72.403 234.549 72.608C234.583 72.6307 234.609 72.6383 234.621 72.6269C234.681 72.5374 234.735 72.4435 234.782 72.3461C234.782 72.3461 234.756 72.3195 234.718 72.3081C234.681 72.2967 234.651 72.2891 234.598 72.3423C234.568 72.3788 234.527 72.4043 234.481 72.4148C234.435 72.4253 234.388 72.4202 234.345 72.4004C234.302 72.3805 234.267 72.3469 234.245 72.3048C234.223 72.2628 234.216 72.2146 234.224 72.1677C234.224 72.1297 234.224 72.1183 234.126 72.0804L234.021 72.031L233.961 72.0955C233.937 72.1292 233.903 72.1536 233.863 72.1647C233.824 72.1757 233.782 72.1728 233.744 72.1563C233.703 72.1407 233.667 72.1126 233.643 72.076C233.618 72.0393 233.605 71.9958 233.605 71.9513C233.605 71.8868 233.605 71.8678 233.549 71.845C233.493 71.8222 233.467 71.845 233.467 71.902C233.448 71.9971 233.417 72.0891 233.373 72.1752C233.325 72.0837 233.29 71.9851 233.272 71.883C233.272 71.8336 233.253 71.8222 233.231 71.8336L233.167 71.8526C233.141 71.8526 233.133 71.883 233.133 71.9551C233.137 71.9823 233.135 72.0101 233.126 72.0359C233.117 72.0618 233.101 72.0849 233.081 72.1031C233.06 72.1262 233.033 72.1441 233.004 72.1554C232.975 72.1668 232.944 72.1714 232.913 72.1689C232.882 72.1663 232.852 72.1567 232.825 72.1407C232.799 72.1247 232.776 72.1028 232.758 72.0766L232.729 72.031L232.624 72.0728C232.519 72.1145 232.519 72.1183 232.515 72.198C232.514 72.2244 232.509 72.2505 232.498 72.2747C232.488 72.2989 232.473 72.3208 232.454 72.3392C232.435 72.3575 232.413 72.3719 232.389 72.3815C232.365 72.3912 232.339 72.3959 232.313 72.3954C232.285 72.4024 232.256 72.4015 232.229 72.3928C232.202 72.3841 232.178 72.3679 232.159 72.3461C232.099 72.2929 232.088 72.2891 232.035 72.3119C231.983 72.3347 231.979 72.3385 231.979 72.3498C232.021 72.4428 232.068 72.5328 232.122 72.6193C232.122 72.6421 232.17 72.6193 232.305 72.5472C232.592 72.3648 232.926 72.2748 233.264 72.2891C233.339 72.3271 233.302 72.3574 233.159 72.3688C232.96 72.3879 232.765 72.4392 232.582 72.5207C232.449 72.5741 232.323 72.6456 232.208 72.7332C232.208 72.7332 232.208 72.7939 232.249 72.8433C232.29 72.8926 232.301 72.9306 232.339 72.904C232.352 72.897 232.362 72.8866 232.37 72.8738C232.377 72.8611 232.38 72.8466 232.38 72.8319C232.38 72.8091 232.38 72.7901 232.38 72.7901C232.443 72.8257 232.501 72.8691 232.552 72.9192C232.524 72.9474 232.492 72.9729 232.459 72.9951C232.387 73.0481 232.319 73.1064 232.256 73.1697C232.148 73.276 232.144 73.276 232.155 73.2191V73.2266ZM229.221 73.071C229.137 73.0427 229.065 72.9848 229.019 72.9078C228.999 72.8625 228.988 72.8133 228.988 72.7636C228.988 72.7138 228.999 72.6646 229.019 72.6193C229.075 72.5017 229.102 72.4865 229.158 72.5282C229.214 72.57 229.236 72.6193 229.158 72.6042C229.079 72.589 229.09 72.6042 229.064 72.6459C229.049 72.6711 229.039 72.6993 229.036 72.7286C229.032 72.7579 229.035 72.7876 229.044 72.8157C229.053 72.8438 229.068 72.8697 229.087 72.8915C229.107 72.9133 229.131 72.9305 229.158 72.942C229.198 72.9638 229.241 72.9771 229.287 72.981C229.332 72.9849 229.377 72.9794 229.42 72.9647C229.448 72.9424 229.471 72.9135 229.486 72.8805C229.501 72.8474 229.508 72.8113 229.506 72.775C229.506 72.718 229.532 72.699 229.555 72.7522C229.566 72.8063 229.562 72.8625 229.542 72.9143C229.523 72.966 229.49 73.0111 229.446 73.0445C229.41 73.0653 229.371 73.0787 229.329 73.0839C229.288 73.0891 229.246 73.086 229.206 73.0748L229.221 73.071ZM232.616 72.8091C232.605 72.7971 232.596 72.7827 232.591 72.7669C232.586 72.7512 232.584 72.7345 232.586 72.718C232.586 72.6763 232.612 72.6649 232.747 72.6117C232.882 72.5586 232.905 72.551 232.95 72.5814C232.995 72.6117 233.017 72.7332 232.95 72.718C232.849 72.7255 232.754 72.7639 232.676 72.8281C232.68 72.8585 232.657 72.8509 232.616 72.8015V72.8091ZM234.021 72.8281C234.021 72.7901 233.785 72.699 233.755 72.7256C233.725 72.7522 233.729 72.7256 233.718 72.6953C233.713 72.6841 233.711 72.6721 233.711 72.6599C233.711 72.6478 233.713 72.6358 233.718 72.6247C233.723 72.6136 233.73 72.6037 233.739 72.5956C233.748 72.5875 233.759 72.5813 233.77 72.5776C233.808 72.5548 233.83 72.5586 233.965 72.6117C234.1 72.6649 234.115 72.6725 234.126 72.7256C234.137 72.7788 234.126 72.7901 234.092 72.8167C234.059 72.8433 234.021 72.8547 234.021 72.8205V72.8281ZM229.634 72.6649C229.588 72.5728 229.533 72.4862 229.469 72.4068C229.3 72.179 229.281 72.1297 229.353 72.0993C229.447 72.1114 229.54 72.133 229.63 72.1639C229.727 72.2006 229.83 72.2224 229.933 72.2284H229.986L229.926 72.3233C229.892 72.3764 229.855 72.4182 229.84 72.4182C229.825 72.4182 229.813 72.4182 229.84 72.365C229.866 72.3119 229.84 72.3271 229.78 72.3081C229.72 72.2891 229.705 72.2891 229.69 72.3081C229.672 72.3386 229.652 72.3678 229.63 72.3954L229.585 72.4599L229.634 72.5244C229.679 72.5814 229.682 72.5852 229.712 72.5586C229.742 72.532 229.768 72.5586 229.712 72.6383C229.656 72.718 229.634 72.7142 229.634 72.6573V72.6649ZM229.6 72.3309C229.622 72.3005 229.634 72.2663 229.622 72.2588C229.55 72.2275 229.475 72.2058 229.398 72.1942C229.439 72.2651 229.489 72.3301 229.547 72.3878C229.568 72.3693 229.586 72.3475 229.6 72.3233V72.3309ZM233.156 72.6535C233.144 72.6391 233.137 72.621 233.137 72.6023C233.137 72.5835 233.144 72.5654 233.156 72.551C233.182 72.5017 233.186 72.4979 233.354 72.4979C233.523 72.4979 233.527 72.4979 233.557 72.5434C233.567 72.5572 233.572 72.5738 233.572 72.5909C233.572 72.608 233.567 72.6246 233.557 72.6383C233.534 72.6877 233.515 72.699 233.497 72.6649C233.402 72.6328 233.299 72.6328 233.204 72.6649C233.186 72.6915 233.178 72.6877 233.152 72.6421L233.156 72.6535ZM230.005 72.1297C230.005 72.0804 230.005 72.0576 229.84 71.9247C229.675 71.7919 229.664 71.7805 229.634 71.7995C229.604 71.8185 229.577 71.7995 229.652 71.7008C229.727 71.6021 229.739 71.6135 229.75 71.6249C229.761 71.6363 229.75 71.6514 229.75 71.6704C229.75 71.6894 229.709 71.6932 229.93 71.883C230.083 72.0196 230.106 72.031 230.124 71.9969C230.143 71.9627 230.169 71.9741 230.169 71.9969C230.129 72.0641 230.079 72.1243 230.02 72.1752C230.02 72.1752 230.005 72.1525 230.005 72.1221V72.1297ZM230.169 71.8564C230.106 71.7729 230.117 71.7577 230.214 71.7957C230.312 71.8336 230.282 71.7957 230.323 71.7729C230.364 71.7501 230.398 71.6666 230.357 71.6249C230.316 71.5831 230.263 71.5793 230.173 71.6249C230.139 71.6494 230.097 71.6625 230.055 71.6625C230.013 71.6625 229.972 71.6494 229.937 71.6249C229.862 71.549 229.888 71.4427 230.012 71.3402C230.136 71.2377 230.113 71.2795 230.151 71.3402C230.188 71.4009 230.151 71.4161 230.102 71.3857C230.053 71.3554 230.05 71.3857 230.008 71.4123C229.967 71.4389 229.952 71.5224 230.008 71.5566C230.064 71.5907 230.057 71.5831 230.139 71.5566C230.222 71.53 230.36 71.511 230.405 71.5566C230.432 71.5794 230.449 71.6111 230.455 71.6458C230.46 71.6806 230.454 71.7163 230.435 71.7463C230.388 71.8247 230.317 71.8858 230.233 71.9209C230.208 71.9114 230.187 71.8941 230.173 71.8716L230.169 71.8564ZM230.522 71.5072C230.484 71.4275 230.499 71.4047 230.559 71.4465C230.569 71.4565 230.58 71.4644 230.592 71.4698C230.605 71.4753 230.618 71.4781 230.632 71.4781C230.646 71.4781 230.659 71.4753 230.672 71.4698C230.684 71.4644 230.696 71.4565 230.705 71.4465C230.72 71.4361 230.732 71.4224 230.74 71.4067C230.748 71.3909 230.753 71.3733 230.754 71.3554C230.754 71.2833 230.713 71.2529 230.63 71.2681C230.402 71.306 230.39 71.306 230.342 71.2681C230.293 71.2301 230.293 71.0631 230.447 70.9644C230.525 70.9151 230.525 70.9151 230.57 71.0024C230.615 71.0897 230.57 71.0783 230.522 71.0441C230.473 71.01 230.473 71.0176 230.432 71.0441C230.331 71.1125 230.36 71.2301 230.477 71.2149C230.735 71.177 230.731 71.177 230.78 71.2149C230.805 71.2467 230.819 71.2862 230.819 71.3269C230.819 71.3677 230.805 71.4072 230.78 71.4389C230.727 71.498 230.66 71.5424 230.585 71.5679C230.559 71.5641 230.548 71.5566 230.522 71.4996V71.5072ZM233.261 71.4882C233.248 71.4765 233.237 71.4621 233.23 71.4461C233.223 71.4301 233.22 71.4128 233.22 71.3952C233.22 71.3777 233.223 71.3604 233.23 71.3444C233.237 71.3283 233.248 71.314 233.261 71.3022C233.273 71.2889 233.288 71.2783 233.305 71.2711C233.322 71.2638 233.34 71.2601 233.358 71.2601C233.376 71.2601 233.394 71.2638 233.411 71.2711C233.428 71.2783 233.443 71.2889 233.455 71.3022V71.3022C233.481 71.3285 233.495 71.364 233.495 71.4009C233.495 71.4379 233.481 71.4733 233.455 71.4996V71.4996C233.442 71.5134 233.426 71.5239 233.408 71.5304C233.39 71.5369 233.371 71.5391 233.352 71.5369C233.334 71.5347 233.316 71.5281 233.3 71.5177C233.284 71.5073 233.27 71.4933 233.261 71.4768V71.4882ZM230.956 71.2795C230.96 71.2638 230.968 71.2494 230.979 71.2377C230.997 71.2377 230.956 71.1314 230.84 70.953L230.806 70.9037H231.057L231.005 70.9417L230.956 70.9796L230.997 71.0441C231.069 71.1694 231.072 71.1694 231.159 71.1201C231.245 71.0707 231.234 71.0707 231.222 71.0252C231.211 70.9796 231.222 70.9758 231.222 70.9758C231.222 70.9758 231.308 71.0479 231.308 71.0745C231.201 71.1514 231.088 71.2212 230.971 71.2833C230.971 71.2833 230.941 71.2833 230.941 71.2833L230.956 71.2795ZM231.601 70.8999C231.601 70.8999 231.601 70.8999 231.627 70.8999C231.653 70.8999 231.653 70.8999 231.653 70.8999H231.627H231.601Z" fill="white"/> +</g> +<path fill-rule="evenodd" clip-rule="evenodd" d="M323.996 107.025C318.663 110.588 312.393 112.489 305.98 112.488C297.381 112.487 289.134 109.071 283.054 102.99C276.973 96.9089 273.558 88.6618 273.558 80.0625C273.558 73.6492 275.459 67.3798 279.023 62.0474C282.586 56.7149 287.65 52.5588 293.575 50.1047C299.501 47.6505 306.021 47.0086 312.311 48.26C318.601 49.5115 324.378 52.6 328.913 57.1352C333.448 61.6704 336.536 67.4484 337.787 73.7386C339.037 80.0288 338.395 86.5486 335.94 92.4736C333.485 98.3986 329.329 103.463 323.996 107.025ZM322.43 55.4433C317.561 52.1903 311.836 50.4544 305.98 50.4551C298.128 50.456 290.598 53.5757 285.047 59.1281C279.495 64.6805 276.376 72.2108 276.376 80.0627C276.376 85.9186 278.113 91.6431 281.366 96.5121C284.619 101.381 289.244 105.176 294.654 107.417C300.064 109.658 306.018 110.244 311.761 109.101C317.504 107.958 322.78 105.138 326.92 100.997C331.061 96.8562 333.881 91.5803 335.023 85.8368C336.165 80.0933 335.578 74.1401 333.336 68.7301C331.095 63.32 327.3 58.6962 322.43 55.4433Z" fill="white"/> +<path d="M314.042 77.6902C314.25 77.7397 314.56 77.7397 314.56 77.8453C314.458 78.2611 313.834 78.3634 313.524 78.7792H313.369C313.214 78.8782 313.263 79.1389 313.108 79.1389C312.951 79.1056 312.788 79.1242 312.643 79.1917C312.737 79.3038 312.857 79.3908 312.993 79.4449C313.129 79.4991 313.276 79.5187 313.422 79.5019C313.465 79.5171 313.504 79.545 313.531 79.582C313.559 79.6191 313.575 79.6636 313.577 79.7098C313.617 79.7063 313.653 79.6874 313.679 79.657C313.732 79.657 313.781 79.657 313.781 79.7098V79.9177C313.63 80.1223 313.369 80.02 313.161 80.0728C313.552 80.1752 313.962 80.1752 314.352 80.0728C314.663 79.9705 314.352 79.4491 314.56 79.1917C314.458 79.1917 314.56 79.0366 314.458 79.0366C314.56 78.9343 314.663 78.7792 314.768 78.7264C314.829 78.7276 314.888 78.7141 314.942 78.6871C314.996 78.6601 315.043 78.6204 315.078 78.5713C315.078 78.4657 314.87 78.4162 314.923 78.3106C315.233 78.1027 315.491 77.7925 315.389 77.4823C315.339 77.3272 314.923 77.3272 314.663 77.2249C314.369 77.1648 314.065 77.183 313.781 77.2777C313.517 77.3211 313.257 77.3896 313.006 77.4823C312.65 77.6011 312.316 77.776 312.016 78.0004C312.388 77.8655 312.771 77.7618 313.161 77.6902C313.453 77.6522 313.75 77.6522 314.042 77.6902V77.6902ZM289.21 80.6602C289.238 80.639 289.262 80.6133 289.282 80.5843L289.206 80.5546L289.21 80.6602ZM290.698 86.9995C291.749 86.7987 292.77 86.4661 293.737 86.0095C292.579 85.1185 291.153 84.7258 289.754 84.3364C289.995 85.2411 290.31 86.1242 290.698 86.9764V86.9995ZM293.077 90.7549C292.802 90.4271 292.541 90.0905 292.295 89.7451C293.536 89.4613 294.872 89.4151 296.067 89.0026C296.222 88.9003 296.38 88.798 296.532 88.6924C296.793 88.5901 297.001 88.3294 297.311 88.1743C297.73 87.8877 298.041 87.4679 298.192 86.983C298.187 86.9446 298.169 86.9089 298.143 86.8807C297.49 87.581 296.718 88.1598 295.862 88.5901C294.773 89.1577 293.582 89.0554 292.444 89.2105C292.493 89.1082 292.599 89.1082 292.701 89.1082C292.701 88.9531 292.807 88.9003 292.909 88.798H293.064C293.117 88.798 293.117 88.6924 293.17 88.6924C293.272 88.6924 293.427 88.6396 293.374 88.6396C293.219 88.435 292.909 88.798 292.651 88.6396C292.754 88.5373 292.701 88.3822 292.807 88.3294H293.011C293.023 88.2513 293.06 88.1793 293.117 88.1248C293.892 87.6562 294.618 87.2932 295.344 86.8807C295.189 86.8807 295.084 87.0358 294.928 86.9335C295.034 86.9335 294.928 86.7751 295.034 86.7751C295.602 86.62 296.067 86.3131 296.638 86.1151C296.433 86.1151 296.275 86.2735 296.067 86.1151C296.173 86.0623 296.222 85.96 296.38 85.96V85.8049C296.38 85.7554 296.433 85.7554 296.483 85.7554C296.444 85.7492 296.408 85.7307 296.38 85.7026C296.433 85.597 296.588 85.6498 296.687 85.5442C296.638 85.5442 296.532 85.5442 296.532 85.4947C296.707 85.3145 296.942 85.2042 297.192 85.1845C297.139 85.0789 296.984 85.1845 296.984 85.0789C296.984 85.0294 297.037 85.0294 297.087 85.0294H296.984C296.882 84.9766 296.932 84.8743 296.932 84.8215C297.242 84.4585 297.242 83.9932 297.4 83.5807C297.347 83.5807 297.295 83.5807 297.295 83.5246C296.777 84.0955 295.948 84.3034 295.173 84.5146H294.912C294.771 84.5714 294.619 84.5961 294.467 84.587C294.315 84.5779 294.167 84.5351 294.034 84.4618C293.848 84.3406 293.674 84.2026 293.513 84.0493C293.108 83.7903 292.674 83.5809 292.219 83.4256C291.311 83.1325 290.372 82.9486 289.421 82.8778C289.398 82.7524 289.378 82.6237 289.358 82.4983C289.586 82.4521 289.817 82.4059 290.044 82.3399C290.926 82.0792 291.754 81.769 292.684 81.8185C292.514 81.7938 292.34 81.7938 292.17 81.8185C291.415 81.8295 290.665 81.9405 289.939 82.1485C289.734 82.1919 289.531 82.2459 289.332 82.3102C289.295 82.0495 289.269 81.7921 289.246 81.5281C289.354 81.5004 289.465 81.4827 289.576 81.4753C290.51 81.3202 291.391 81.4753 292.325 81.5776C292.993 81.6486 293.655 81.77 294.305 81.9406C294.562 81.9406 294.615 82.3564 294.823 82.4059C295.133 82.5115 295.443 82.4059 295.757 82.6138C295.757 82.5115 295.704 82.4059 295.757 82.3036C295.961 82.0957 296.219 82.3564 296.417 82.2508C296.829 81.9901 296.051 81.5248 295.846 81.1618C295.852 81.123 295.871 81.0871 295.899 81.0595C296.311 81.4225 296.621 81.835 297.14 82.0957C297.4 82.2013 298.021 82.3564 297.915 82.0462C297.658 81.4753 297.14 81.01 296.727 80.4919V80.284C296.621 80.284 296.621 80.2312 296.572 80.1784V79.9738C296.364 79.8682 296.417 79.6438 296.311 79.5052C296.156 79.2478 296.258 78.8815 296.156 78.5746C296.067 78.2858 296.003 77.9899 295.965 77.6902C295.81 76.8091 295.602 76.0402 295.499 75.2053C295.394 74.2153 296.067 73.4431 296.532 72.5653C296.872 71.9035 297.371 71.3366 297.984 70.9153C298.193 70.3012 298.531 69.7387 298.974 69.2653C299.39 68.7604 300.007 68.4997 300.575 68.2291C304.535 66.4471 309.449 66.8101 313.323 68.2291C313.721 68.4111 314.063 68.6973 314.313 69.0574C314.418 69.2092 314.573 69.5227 314.471 69.7174C314.366 69.9781 314.313 70.3774 314.055 70.4929C313.711 70.6345 313.332 70.6712 312.966 70.5985C312.756 70.5891 312.548 70.5537 312.346 70.4929C313.121 70.8031 313.847 71.1529 314.366 71.8921C314.418 71.9944 314.626 72.0472 314.831 72.0472C314.884 72.0472 314.884 72.1528 314.884 72.2023C314.781 72.3046 314.676 72.3574 314.729 72.5125H314.884C315.144 72.4102 315.092 71.8921 315.451 72.0472C315.58 72.1249 315.673 72.2494 315.712 72.3947C315.751 72.5399 315.732 72.6945 315.659 72.826C315.465 73.0121 315.257 73.1841 315.039 73.3408C315.013 73.3983 314.999 73.4608 314.999 73.524C314.999 73.5871 315.013 73.6496 315.039 73.7071C315.17 73.8908 315.258 74.1017 315.296 74.3242C315.451 74.6905 315.504 75.103 315.659 75.466C315.907 76.2175 316.029 77.0046 316.022 77.7958C316.022 78.2116 315.818 78.5746 315.973 78.9871C316.11 79.3749 316.301 79.7415 316.54 80.0761C316.749 80.3401 316.94 80.618 317.111 80.9077C317.421 81.4225 317.989 81.9406 317.732 82.5577C317.576 82.924 317.009 82.8679 316.646 83.0758C316.336 83.3365 316.593 83.7358 316.748 84.0097C317.009 84.475 316.438 84.7852 316.088 84.9403C316.19 85.0954 316.398 85.0459 316.451 85.1482C316.504 85.4056 316.761 85.5607 316.606 85.8082C316.398 86.1184 315.778 86.2768 316.088 86.7421C316.296 87.1051 316.161 87.5077 316.035 87.8806C315.957 88.0773 315.831 88.2513 315.669 88.3868C315.506 88.5222 315.312 88.6148 315.105 88.6561C314.784 88.7536 314.444 88.7717 314.115 88.7089C314.014 88.6489 313.901 88.6138 313.785 88.6066C312.907 88.501 312.026 88.2436 311.145 88.2436C310.895 88.2812 310.651 88.3511 310.419 88.4515C309.585 89.0806 308.972 89.9574 308.666 90.9562C308.501 91.7614 308.383 92.4676 308.307 93.0814C307.544 93.2035 307.785 93.2695 305.97 93.2695C304.155 93.2695 300.555 92.4544 298.318 91.0486L298.413 90.9562C299.099 90.1247 299.873 89.3711 300.723 88.7089C300.776 88.6561 300.776 88.5538 300.829 88.501C300.568 88.6066 300.413 88.831 300.169 88.9168C300.116 88.9168 300.063 88.864 300.116 88.8145L300.72 88.369C300.72 88.4218 300.667 88.4218 300.618 88.4218C300.568 88.4218 300.565 88.369 300.565 88.3195C299.905 88.2139 299.374 88.6792 298.915 89.095C298.809 89.1478 298.707 89.0422 298.654 89.0422C297.879 89.3029 297.308 89.9761 296.529 90.2863V90.184C296.227 90.3253 295.917 90.4509 295.602 90.5602C295.174 90.6305 294.74 90.6493 294.308 90.6163C293.895 90.6602 293.484 90.7252 293.077 90.811" fill="white"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M321.054 57.5091C316.592 54.5287 311.346 52.9386 305.98 52.9399C298.786 52.9408 291.888 55.7991 286.801 60.8861C281.715 65.9731 278.857 72.8722 278.857 80.0659C278.857 85.432 280.447 90.6778 283.428 95.1398C286.409 99.6017 290.646 103.079 295.604 105.133C300.562 107.187 306.017 107.724 311.28 106.677C316.543 105.63 321.377 103.046 325.171 99.2514C328.965 95.4568 331.549 90.6222 332.595 85.3591C333.642 80.096 333.104 74.6408 331.049 69.6835C328.995 64.7262 325.517 60.4894 321.054 57.5091ZM296.689 66.1586C299.439 64.3205 302.673 63.339 305.98 63.3384C308.177 63.3379 310.352 63.7702 312.381 64.6105C314.411 65.4508 316.255 66.6826 317.808 68.2357C319.362 69.7887 320.594 71.6326 321.434 73.6619C322.275 75.6912 322.708 77.8662 322.708 80.0628C322.708 83.3704 321.727 86.6038 319.889 89.354C318.052 92.1043 315.44 94.2479 312.384 95.5138C309.329 96.7797 305.966 97.1111 302.722 96.4661C299.478 95.821 296.498 94.2285 294.159 91.8899C291.82 89.5513 290.226 86.5716 289.581 83.3276C288.935 80.0836 289.266 76.721 290.531 73.6649C291.796 70.6089 293.94 67.9967 296.689 66.1586ZM322.236 65.7242L322.998 65.0642L323.081 65.1566C323.241 65.3118 323.355 65.5082 323.411 65.7242C323.415 65.801 323.4 65.8777 323.367 65.947C323.333 66.0163 323.282 66.0759 323.219 66.1202C323.171 66.1726 323.109 66.2117 323.041 66.2336C322.973 66.2556 322.9 66.2597 322.83 66.2456C322.624 66.1474 322.446 65.9973 322.315 65.81L322.236 65.7242ZM321.84 68.6513L322.47 66.7043C322.649 66.8713 322.886 66.9614 323.13 66.9551C323.375 66.9518 323.611 66.8578 323.79 66.6911C323.914 66.5975 324.014 66.4762 324.082 66.3369C324.15 66.1976 324.185 66.0443 324.183 65.8892C324.136 65.5152 323.966 65.1672 323.701 64.8992L322.929 64.0082L320.015 66.5294L320.556 67.1531L321.916 65.975L321.216 67.9187L321.84 68.6513ZM317.279 64.2128L319.53 61.0745L320.19 61.5497L317.959 64.688L317.279 64.2128ZM315.656 59.6126L314.356 62.4836L313.607 62.1536L314.907 59.2826L314.045 58.88L314.336 58.2431L316.804 59.3585L316.517 59.9954L315.656 59.6126ZM308.122 60.1736L308.666 59.7446C308.696 59.8905 308.771 60.0232 308.881 60.1241C308.993 60.2275 309.133 60.2952 309.284 60.3188C309.443 60.3576 309.611 60.3389 309.759 60.266C309.82 60.2324 309.872 60.1851 309.912 60.1278C309.951 60.0706 309.977 60.0049 309.986 59.936C310.019 59.7545 309.868 59.5433 309.531 59.2991L309.277 59.111C309.036 58.944 308.832 58.7295 308.676 58.4807C308.56 58.2488 308.54 57.9805 308.619 57.7337C308.699 57.4868 308.872 57.2811 309.102 57.1607C309.415 56.9983 309.775 56.9516 310.118 57.0287C310.324 57.0626 310.52 57.1403 310.693 57.2564C310.851 57.3766 310.979 57.5326 311.066 57.7118L310.505 58.0847C310.472 57.9738 310.409 57.8743 310.323 57.7976C310.228 57.722 310.114 57.673 309.993 57.6557C309.855 57.6231 309.71 57.6407 309.584 57.7052C309.53 57.734 309.483 57.7749 309.448 57.8247C309.412 57.8745 309.389 57.9319 309.379 57.9923C309.343 58.1936 309.508 58.4114 309.868 58.6523L310.033 58.7612C310.283 58.9217 310.496 59.1345 310.656 59.3849C310.773 59.5838 310.815 59.8178 310.775 60.0449C310.754 60.2066 310.697 60.3614 310.607 60.4974C310.517 60.6335 310.397 60.7474 310.257 60.8303C309.943 61.0065 309.574 61.0583 309.224 60.9755C308.966 60.9348 308.721 60.8379 308.505 60.6917C308.325 60.5654 308.189 60.3851 308.119 60.1769L308.122 60.1736ZM303.307 60.7478L303.03 56.9L305.291 56.7251L305.34 57.428L303.901 57.5369L303.961 58.3256L305.39 58.22L305.442 58.9163L304.02 59.0252L304.093 59.9855L305.515 59.87L305.571 60.5696L303.307 60.7478ZM298.928 61.8962L296.344 58.7018L297.209 58.4114L298.687 60.4475C298.717 60.4904 298.766 60.5663 298.839 60.6851L299.07 61.0844C299.037 60.9227 299.011 60.7742 298.997 60.6455C298.983 60.5361 298.975 60.4259 298.974 60.3155L298.931 57.824L299.783 57.5336L299.661 61.6421L298.928 61.8962ZM292.685 65.7572L293.305 65.2688L291.942 63.5396C291.836 63.4043 291.744 63.2954 291.668 63.2096C291.592 63.1263 291.512 63.047 291.427 62.972C291.579 63.0578 291.711 63.1271 291.827 63.1799C291.92 63.2254 292.017 63.2629 292.117 63.2921L294.909 64.0049L295.546 63.5L293.163 60.4805L292.546 60.9656L293.866 62.6585C293.968 62.7905 294.061 62.9027 294.137 62.9885C294.214 63.074 294.295 63.1555 294.381 63.2327C294.233 63.1469 294.101 63.0776 293.985 63.0248C293.89 62.9799 293.792 62.9434 293.691 62.9159L290.965 62.2064L290.305 62.7344L292.685 65.7572ZM290.322 68.4863L287.296 66.107L287.804 65.447L290.82 67.8395L290.322 68.4863ZM319.233 95.5957L319.893 96.3646L319.985 96.2821C320.172 96.1526 320.321 95.9761 320.418 95.7706C320.431 95.6998 320.427 95.6269 320.405 95.5583C320.383 95.4897 320.344 95.4277 320.292 95.3779C320.247 95.3154 320.188 95.265 320.119 95.231C320.049 95.197 319.973 95.1806 319.896 95.1832C319.68 95.239 319.484 95.3531 319.329 95.5132L319.233 95.5957ZM320.873 96.1303L322.82 96.7705L322.111 97.3909L320.17 96.6781L321.338 98.0443L320.715 98.5822L318.21 95.6518L319.081 94.8895C319.35 94.6261 319.698 94.459 320.071 94.4143C320.226 94.4132 320.379 94.4485 320.518 94.5173C320.656 94.5861 320.777 94.6864 320.87 94.8103C321.032 94.9924 321.124 95.2263 321.13 95.4703C321.134 95.7154 321.042 95.9522 320.873 96.1303ZM315.765 97.2721L317.715 100.598L318.424 100.179L316.477 96.8563L315.765 97.2721ZM310.561 99.4336L311.808 103.064L312.554 102.793L311.841 100.711C311.785 100.549 311.732 100.41 311.689 100.308C311.652 100.219 311.607 100.132 311.561 100.044C311.554 100.031 311.547 100.018 311.541 100.004C311.656 100.136 311.755 100.245 311.848 100.334C311.922 100.409 312.002 100.476 312.088 100.536L314.484 102.13L315.25 101.869L314.002 98.239L313.26 98.4964L313.956 100.559L313.965 100.582C314.017 100.73 314.061 100.854 314.105 100.952C314.15 101.056 314.201 101.159 314.257 101.258C314.144 101.123 314.042 101.018 313.95 100.928C313.876 100.853 313.796 100.786 313.709 100.727L311.369 99.1597L310.561 99.4336ZM306.568 99.8626L306.858 103.704L309.118 103.532L309.066 102.833L307.627 102.945L307.551 101.981L308.993 101.872L308.94 101.173L307.501 101.282L307.439 100.493L308.881 100.384L308.825 99.691L306.568 99.8626ZM301.38 99.4699L302.337 103.446L303.119 103.555L304.993 99.8956L304.099 99.79L303.063 102.06C303.03 102.14 302.99 102.242 302.947 102.364C302.905 102.486 302.865 102.631 302.822 102.793C302.811 102.653 302.799 102.526 302.787 102.412C302.785 102.383 302.782 102.355 302.779 102.328C302.773 102.262 302.765 102.207 302.758 102.162C302.751 102.113 302.746 102.076 302.746 102.05L302.284 99.5755L301.38 99.4699ZM298.39 98.3545L295.585 101.374L296.39 101.707L296.948 101.047L298.331 101.608V102.483L299.195 102.836L299.261 98.7043L298.39 98.3545ZM298.476 99.6151L298.41 100.935L297.417 100.536L298.265 99.5458C298.288 99.5161 298.327 99.4633 298.384 99.3775L298.572 99.0937C298.559 99.149 298.55 99.2003 298.541 99.2478C298.529 99.3135 298.518 99.3719 298.502 99.4237C298.476 99.5128 298.476 99.5788 298.476 99.6151ZM295.219 96.6913L293.899 97.7968L294.301 98.0707L295.879 97.1335L295.219 96.6913ZM292.051 94.147L289.381 96.9256L290.922 98.4073L291.407 97.9024L290.46 96.9883L292.645 94.7179L292.051 94.147Z" fill="white"/> +<defs> +<clipPath id="clip0_12297_72121"> +<rect width="117" height="24" fill="white" transform="translate(120 68)"/> +</clipPath> +</defs> +</svg> diff --git a/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.spec.tsx b/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.spec.tsx index 8e8e3841c26bc8f514f5c47dfb4c2b097a2d2c84..42801b8be53e3a256e153d752dfc4a7e9ef06dbb 100644 --- a/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.spec.tsx +++ b/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.spec.tsx @@ -3,10 +3,11 @@ import { mount } from 'enzyme' import ActivateHalfHourLoad from './ActivateHalfHourLoad' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' -import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' import * as reactRedux from 'react-redux' -import { userChallengeExplo1OnGoing } from '../../../tests/__mocks__/userChallengeData.mock' import Button from '@material-ui/core/Button' +import { profileData } from '../../../tests/__mocks__/profile.mock' +import { DateTime } from 'luxon' +import * as profileActions from 'store/profile/profile.actions' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -17,44 +18,92 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) +jest.mock('components/Hooks/useExploration', () => { + return () => ['', jest.fn()] +}) +const localSpy = jest.spyOn(DateTime, 'local') const mockUseSelector = jest.spyOn(reactRedux, 'useSelector') +const mockUseDispatch = jest.spyOn(reactRedux, 'useDispatch') +const updateProfileSpy = jest.spyOn(profileActions, 'updateProfile') const mockConfigureStore = configureStore([]) const mockStore = mockConfigureStore({ ecolyo: { - gloabl: globalStateData, + profile: profileData, }, }) describe('ActivateHalfHourLoad component test', () => { - it('should open konnector website when button is clicked', () => { - mockUseSelector.mockReturnValue(userChallengeExplo1OnGoing) + beforeEach(() => { + localSpy.mockClear() + mockUseSelector.mockClear() + mockUseDispatch.mockClear() + updateProfileSpy.mockClear() + }) + it('should render correctly ActivatehalfHourLoad', () => { + localSpy.mockReturnValue( + DateTime.fromISO('2020-10-10T08:08:08.008Z', { zone: 'utc' }) + ) + mockUseSelector.mockReturnValue(profileData) + mockUseDispatch.mockReturnValue(jest.fn()) const wrapper = mount( <Provider store={mockStore}> <ActivateHalfHourLoad /> </Provider> ) + expect(wrapper.getElement()).toMatchSnapshot() + }) - global.open = jest.fn() - - wrapper.find(Button).simulate('click') - expect(global.open).toHaveBeenCalledWith( - 'https://mon-compte-particulier.enedis.fr/donnees/', - '_blank' + it('should render correctly ActivatehalfHourLoad with activateHalfHourDate +1 day > today', () => { + const _mockStore = mockConfigureStore({ + ecolyo: { + profile: { + ...profileData, + activateHalfHourDate: DateTime.fromISO('2020-10-10T08:00:00.000Z', { + zone: 'utc', + }), + }, + }, + }) + localSpy.mockReturnValue( + DateTime.fromISO('2020-10-10T08:08:08.008Z', { zone: 'utc' }) + ) + mockUseSelector.mockReturnValue(profileData) + mockUseDispatch.mockReturnValue(jest.fn()) + const wrapper = mount( + <Provider store={_mockStore}> + <ActivateHalfHourLoad /> + </Provider> ) + expect(wrapper.getElement()).toMatchSnapshot() }) - it('should render correctly ActivatehalfHourLoad', () => { - mockUseSelector.mockReturnValue(userChallengeExplo1OnGoing) - + it('should open konnector website when button is clicked and set the activateHalfHourDate in profile', () => { + localSpy.mockReturnValue( + DateTime.fromISO('2020-10-10T08:08:08.008Z', { zone: 'utc' }) + ) + mockUseSelector.mockReturnValue(profileData) + mockUseDispatch.mockReturnValue(jest.fn()) const wrapper = mount( <Provider store={mockStore}> <ActivateHalfHourLoad /> </Provider> ) - expect(wrapper.getElement()).toMatchSnapshot() + global.open = jest.fn() + + wrapper.find(Button).simulate('click') + expect(updateProfileSpy).toBeCalledTimes(1) + expect(updateProfileSpy).toHaveBeenCalledWith({ + activateHalfHourDate: DateTime.fromISO('2020-10-10T08:08:08.008Z', { + zone: 'utc', + }), + }) + expect(global.open).toHaveBeenCalledWith( + 'https://mon-compte-particulier.enedis.fr/donnees/', + '_blank' + ) }) }) diff --git a/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.tsx b/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.tsx index 432a7cf638142f3236612dc2a5dc2bea6a2b0db5..e13e3c3927ad17114df940add648ebb1072f6188 100644 --- a/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.tsx +++ b/src/components/ActivateHalfHourLoad/ActivateHalfHourLoad.tsx @@ -1,4 +1,6 @@ -import React from 'react' +import React, { Dispatch, useCallback } from 'react' +import { AppStore } from 'store' +import { useDispatch, useSelector } from 'react-redux' import { IuseI18n, useI18n } from 'cozy-ui/transpiled/react/I18n' import ConfigService from 'services/fluidConfig.service' import Button from '@material-ui/core/Button' @@ -7,7 +9,13 @@ import iconEnedisLogo from 'assets/icons/visu/enedis-logo.svg' import './activateHalfHourLoad.scss' import useExploration from 'components/Hooks/useExploration' import { UserExplorationID } from 'enum/userExploration.enum' -import { FluidConfig } from 'models' +import { FluidConfig, Profile } from 'models' +import { decoreText } from 'utils/decoreText' +import { DateTime } from 'luxon' +import { + ProfileActionTypes, + updateProfile, +} from 'store/profile/profile.actions' interface ActivateHalfHourLoadProps { consentActive?: boolean @@ -17,24 +25,56 @@ const ActivateHalfHourLoad: React.FC<ActivateHalfHourLoadProps> = ({ consentActive = false, }: ActivateHalfHourLoadProps) => { const { t }: IuseI18n = useI18n() + const { activateHalfHourDate } = useSelector( + (state: AppStore) => state.ecolyo.profile + ) + const dispatch: Dispatch<ProfileActionTypes> = useDispatch() const fluidConfig: Array<FluidConfig> = new ConfigService().getFluidConfig() const [, setValidExploration] = useExploration() const tradKey: string = consentActive ? 'consent_active' : 'no_consent_active' + const activateConsent = useCallback(() => { + setValidExploration(UserExplorationID.EXPLORATION004) + const partialProfile: Partial<Profile> = { + activateHalfHourDate: DateTime.local().setZone('utc', { + keepLocalTime: true, + }), + } + dispatch(updateProfile(partialProfile)) + window.open(fluidConfig[0].konnectorConfig.activation, '_blank') + }, [dispatch, fluidConfig, setValidExploration]) + return ( <> <div className="activatehalfhour-box"> <div className="activatehalfhour-box-header header-text text-16-normal"> - {t(`timestep.activate.enedis.${tradKey}.info`)} + {activateHalfHourDate && + activateHalfHourDate.plus({ days: 1 }).startOf('day') > + DateTime.local().setZone('utc', { + keepLocalTime: true, + }) ? ( + <> + <h2 className="title text-20-bold"> + {t(`timestep.activate.enedis.consent_activated.title`)} + <br /> + {t(`timestep.activate.enedis.consent_activated.title_2`)} + </h2> + {t(`timestep.activate.enedis.consent_activated.info`)} + </> + ) : ( + <> + <h2 className="title text-20-bold"> + {t(`timestep.activate.enedis.${tradKey}.title`)} + </h2> + {decoreText(t(`timestep.activate.enedis.${tradKey}.info`))} + </> + )} </div> <Button aria-label={t( `timestep.activate.enedis.${tradKey}.accessibility.button_activate` )} - onClick={() => { - setValidExploration(UserExplorationID.EXPLORATION004) - window.open(fluidConfig[0].konnectorConfig.activation, '_blank') - }} + onClick={activateConsent} classes={{ root: 'btn-highlight', label: 'text-16-bold', @@ -45,7 +85,7 @@ const ActivateHalfHourLoad: React.FC<ActivateHalfHourLoadProps> = ({ <StyledIcon icon={iconEnedisLogo} size={48} /> </div> <div className="oauthform-button-text text-18-bold"> - <div> {t(`timestep.activate.enedis.${tradKey}.label1`)}</div> + {t(`timestep.activate.enedis.${tradKey}.label1`)} </div> </div> </Button> diff --git a/src/components/ActivateHalfHourLoad/__snapshots__/ActivateHalfHourLoad.spec.tsx.snap b/src/components/ActivateHalfHourLoad/__snapshots__/ActivateHalfHourLoad.spec.tsx.snap index 74aaecb0132b62a1ccd63118781ab466c28f21a5..3b624456f0206ebc3dd18b7eb8353c0cf2a910f0 100644 --- a/src/components/ActivateHalfHourLoad/__snapshots__/ActivateHalfHourLoad.spec.tsx.snap +++ b/src/components/ActivateHalfHourLoad/__snapshots__/ActivateHalfHourLoad.spec.tsx.snap @@ -16,3 +16,20 @@ exports[`ActivateHalfHourLoad component test should render correctly Activatehal <ActivateHalfHourLoad /> </Provider> `; + +exports[`ActivateHalfHourLoad component test should render correctly ActivatehalfHourLoad with activateHalfHourDate +1 day > today 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <ActivateHalfHourLoad /> +</Provider> +`; diff --git a/src/components/ActivateHalfHourLoad/activateHalfHourLoad.scss b/src/components/ActivateHalfHourLoad/activateHalfHourLoad.scss index 839e0e8df7c9b30bfd86cc8464f4d7f687d628b6..60a62f65c327a18ba16fa4b7c9390e84b7314195 100644 --- a/src/components/ActivateHalfHourLoad/activateHalfHourLoad.scss +++ b/src/components/ActivateHalfHourLoad/activateHalfHourLoad.scss @@ -12,6 +12,12 @@ min-height: 29.5rem; @media #{$large-phone} { min-height: 21.5rem; + padding: 0; + } + + .title { + color: $elec-color; + margin-bottom: 18px; } .activatehalfhour-box-header { @@ -22,7 +28,11 @@ color: $grey-bright; width: 50%; @media #{$large-phone} { - width: 80%; + width: 90%; + } + span { + color: $elec-color; + font-weight: bold; } } button.btn-highlight { diff --git a/src/components/Analysis/PieChart.spec.tsx b/src/components/Analysis/PieChart.spec.tsx index 035cd072f3108718a1db2886751e56e6be44e69b..11b0a66908c3bf5338bcb071e7adcfc800ca0d47 100644 --- a/src/components/Analysis/PieChart.spec.tsx +++ b/src/components/Analysis/PieChart.spec.tsx @@ -5,6 +5,8 @@ import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' import PieChart from './PieChart' +import { DataloadValueDetail } from 'models' +import { DataloadState } from 'enum/dataload.enum' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -18,6 +20,11 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { const mockStore = configureStore([]) describe('PieChart component', () => { + const mockDataloadValueDetailArray: DataloadValueDetail[] = [ + { value: 10, state: DataloadState.VALID }, + { value: 20, state: DataloadState.VALID }, + { value: 30, state: DataloadState.VALID }, + ] it('should be rendered correctly', () => { const store = mockStore({ ecolyo: { @@ -35,7 +42,7 @@ describe('PieChart component', () => { zone: 'utc', })} totalValue={60} - dataArray={[10, 20, 30]} + dataloadValueDetailArray={mockDataloadValueDetailArray} /> </Provider> ).getElement() @@ -58,7 +65,7 @@ describe('PieChart component', () => { zone: 'utc', })} totalValue={60} - dataArray={[10, 20, 30]} + dataloadValueDetailArray={mockDataloadValueDetailArray} /> </Provider> ) diff --git a/src/components/Analysis/PieChart.tsx b/src/components/Analysis/PieChart.tsx index 7091bd02c1416411a3b15d753f60758292f966d0..d831ee1e8f82095f8c593f399c2b178e2fb358e2 100644 --- a/src/components/Analysis/PieChart.tsx +++ b/src/components/Analysis/PieChart.tsx @@ -6,11 +6,12 @@ import { formatNumberValues } from 'utils/utils' import { DateTime } from 'luxon' import { convertDateToMonthString } from 'utils/date' import EstimatedConsumptionModal from 'components/ConsumptionVisualizer/EstimatedConsumptionModal' +import { DataloadValueDetail } from 'models' interface PieProps { innerRadius: number outerRadius: number - dataArray: number[] + dataloadValueDetailArray: DataloadValueDetail[] width: number height: number totalValue: number @@ -20,7 +21,7 @@ interface PieProps { const PieChart: React.FC<PieProps> = ({ innerRadius, outerRadius, - dataArray, + dataloadValueDetailArray, width, height, totalValue, @@ -36,7 +37,10 @@ const PieChart: React.FC<PieProps> = ({ }, []) useEffect(() => { - const data = createPie(dataArray) + const dataloadArray: number[] = dataloadValueDetailArray.map( + dataload => dataload.value + ) + const data = createPie(dataloadArray) const group = d3.select(ref.current) const groupWithData = group.selectAll('g.arc').data(data) const colors = ['#D87B39', '#3A98EC', '#45D1B8'] @@ -62,7 +66,7 @@ const PieChart: React.FC<PieProps> = ({ .attr('class', 'arc') .attr('d', createArc) .attr('fill', (d, i) => colors[i]) - }, [createPie, dataArray, innerRadius, outerRadius]) + }, [createPie, dataloadValueDetailArray, innerRadius, outerRadius]) return ( <div diff --git a/src/components/Analysis/TotalAnalysisChart.spec.tsx b/src/components/Analysis/TotalAnalysisChart.spec.tsx index 26f22d13f87761cc73e5c6ccb91d029b5d90fcf0..2ec549add6f76f5e1ece5bf527f729fb31829249 100644 --- a/src/components/Analysis/TotalAnalysisChart.spec.tsx +++ b/src/components/Analysis/TotalAnalysisChart.spec.tsx @@ -2,13 +2,17 @@ import React from 'react' import { mount } from 'enzyme' import { DateTime } from 'luxon' -import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' import { Provider } from 'react-redux' -import configureStore from 'redux-mock-store' import TotalAnalysisChart from './TotalAnalysisChart' import { FluidType } from 'enum/fluid.enum' import { graphMonthData } from '../../../tests/__mocks__/datachartData.mock' import { act } from 'react-dom/test-utils' +import { + createMockStore, + mockInitialEcolyoState, +} from '../../../tests/__mocks__/store' +import { Datachart } from 'models' +import { DataloadState } from 'enum/dataload.enum' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -27,16 +31,16 @@ jest.mock('services/consumption.service', () => { } }) }) -jest.mock('components/Analysis/PieChart', () => 'PieChart') -const mockStore = configureStore([]) +jest.mock('components/Analysis/PieChart', () => 'mock-piechart') describe('TotalAnalysisChart component', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let store: any + beforeEach(() => { + store = createMockStore(mockInitialEcolyoState) + }) + it('should be rendered correctly', () => { - const store = mockStore({ - ecolyo: { - global: globalStateData, - }, - }) const wrapper = mount( <Provider store={store}> <TotalAnalysisChart @@ -50,11 +54,6 @@ describe('TotalAnalysisChart component', () => { expect(wrapper).toMatchSnapshot() }) it('should render several fluids and display month data', async () => { - const store = mockStore({ - ecolyo: { - global: globalStateData, - }, - }) mockgetGraphData.mockResolvedValueOnce(graphMonthData) const wrapper = mount( <Provider store={store}> @@ -73,21 +72,18 @@ describe('TotalAnalysisChart component', () => { expect(wrapper.find('.fluidconso').exists()).toBeTruthy() }) it('should render empty price', async () => { - const store = mockStore({ - ecolyo: { - global: globalStateData, - }, - }) - const emptyData = { + const emptyData: Datachart = { actualData: [ { date: DateTime.fromISO('2020-09-01T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [-1], + state: DataloadState.VALID, + valueDetail: [{ value: -1, state: DataloadState.EMPTY }], }, ], + comparisonData: null, } mockgetGraphData.mockResolvedValueOnce(emptyData) const wrapper = mount( @@ -107,21 +103,18 @@ describe('TotalAnalysisChart component', () => { expect(wrapper.find('.fluidconso').text()).toBe('--- €') }) it('should render empty price for one fluid', async () => { - const store = mockStore({ - ecolyo: { - global: globalStateData, - }, - }) - const emptyData = { + const emptyData: Datachart = { actualData: [ { date: DateTime.fromISO('2020-09-01T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [-1], + state: DataloadState.VALID, + valueDetail: [{ value: -1, state: DataloadState.EMPTY }], }, ], + comparisonData: null, } mockgetGraphData.mockResolvedValueOnce(emptyData) const wrapper = mount( diff --git a/src/components/Analysis/TotalAnalysisChart.tsx b/src/components/Analysis/TotalAnalysisChart.tsx index 817670e0ef98f87eae654f8cb3575eee12fd9f38..e7997182a4d1dcfa2779e5c51a2346e89b1d9b06 100644 --- a/src/components/Analysis/TotalAnalysisChart.tsx +++ b/src/components/Analysis/TotalAnalysisChart.tsx @@ -5,7 +5,7 @@ import { useClient } from 'cozy-client' import ConsumptionDataManager from 'services/consumption.service' import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' -import { TimePeriod } from 'models' +import { DataloadValueDetail, TimePeriod } from 'models' import PieChart from './PieChart' import './totalAnalysisChart.scss' import { getNavPicto } from 'utils/picto' @@ -23,7 +23,9 @@ const TotalAnalysisChart: React.FC<TotalAnalysisChartProps> = ({ analysisDate, fluidTypes, }: TotalAnalysisChartProps) => { - const [dataLoadArray, setDataLoadArray] = useState<number[] | null>(null) + const [dataLoadValueDetailArray, setDataLoadValueDetailArray] = useState< + DataloadValueDetail[] | null + >(null) const [totalLoadValue, setTotalLoadValue] = useState<number>(0) const client = useClient() const { t } = useI18n() @@ -45,10 +47,11 @@ const TotalAnalysisChart: React.FC<TotalAnalysisChartProps> = ({ TimeStep.MONTH, fluidTypes, undefined, + undefined, true ) if (monthTotalData && monthTotalData.actualData) { - setDataLoadArray(monthTotalData.actualData[0].valueDetail) + setDataLoadValueDetailArray(monthTotalData.actualData[0].valueDetail) setTotalLoadValue(monthTotalData.actualData[0].value) } } @@ -67,9 +70,9 @@ const TotalAnalysisChart: React.FC<TotalAnalysisChartProps> = ({ }} > <div className="text-24-normal title">{t('analysis_pie.total')}</div> - {dataLoadArray && ( + {dataLoadValueDetailArray && ( <PieChart - dataArray={dataLoadArray} + dataloadValueDetailArray={dataLoadValueDetailArray} totalValue={totalLoadValue} width={radius} height={radius} @@ -80,13 +83,15 @@ const TotalAnalysisChart: React.FC<TotalAnalysisChartProps> = ({ .startOf('month')} /> )} - {dataLoadArray && fluidTypes.length > 1 && ( + {dataLoadValueDetailArray && fluidTypes.length > 1 && ( <div className="total-card-container"> - {dataLoadArray.map((load, index) => { + {dataLoadValueDetailArray.map((dataload, index) => { return ( <div key={index} className="total-card"> <div className="text-18-bold fluidconso"> - {load !== -1 ? `${formatNumberValues(load)} €` : '--- €'} + {dataload.value !== -1 + ? `${formatNumberValues(dataload.value)} €` + : '--- €'} </div> <Icon className="euro-fluid-icon" diff --git a/src/components/Analysis/__snapshots__/ElecHalfHourChart.spec.tsx.snap b/src/components/Analysis/__snapshots__/ElecHalfHourChart.spec.tsx.snap index 4b4a2fe8569330df5c18b54ca6a02c15980ed2c0..8e10e4a997cc5b3069dd4726d95840d0a235aac6 100644 --- a/src/components/Analysis/__snapshots__/ElecHalfHourChart.spec.tsx.snap +++ b/src/components/Analysis/__snapshots__/ElecHalfHourChart.spec.tsx.snap @@ -18,21 +18,25 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = ` Array [ Object { "date": "2021-09-23T00:00:00.000Z", + "state": "VALID", "value": 12, "valueDetail": null, }, Object { "date": "2021-09-23T00:00:00.000Z", + "state": "VALID", "value": 12, "valueDetail": null, }, Object { "date": "2021-09-23T00:00:00.000Z", + "state": "VALID", "value": 12, "valueDetail": null, }, Object { "date": "2021-09-23T00:00:00.000Z", + "state": "VALID", "value": 12, "valueDetail": null, }, diff --git a/src/components/Analysis/__snapshots__/PieChart.spec.tsx.snap b/src/components/Analysis/__snapshots__/PieChart.spec.tsx.snap index 9e545f371d73d8e87cb173cc6a0e8cfde8465071..b630956172b5d0b582dae7a95fc56e3f765a3a24 100644 --- a/src/components/Analysis/__snapshots__/PieChart.spec.tsx.snap +++ b/src/components/Analysis/__snapshots__/PieChart.spec.tsx.snap @@ -15,11 +15,20 @@ exports[`PieChart component should be rendered correctly 1`] = ` > <PieChart currentAnalysisDate={"2021-07-01T00:00:00.000Z"} - dataArray={ + dataloadValueDetailArray={ Array [ - 10, - 20, - 30, + Object { + "state": "VALID", + "value": 10, + }, + Object { + "state": "VALID", + "value": 20, + }, + Object { + "state": "VALID", + "value": 30, + }, ] } height={300} diff --git a/src/components/Charts/BarChart.tsx b/src/components/Charts/BarChart.tsx index 2068381d287e8bd692ec5822aee0f7c1da576aa6..e47408ad23520e872360a122ddf180e1e251e1d2 100644 --- a/src/components/Charts/BarChart.tsx +++ b/src/components/Charts/BarChart.tsx @@ -9,6 +9,7 @@ import { Datachart } from 'models' import Bar from 'components/Charts/Bar' import AxisBottom from 'components/Charts/AxisBottom' import AxisRight from 'components/Charts/AxisRight' +import { DataloadState } from 'enum/dataload.enum' export interface BarChartProps { chartData: Datachart @@ -106,10 +107,10 @@ const BarChart: React.FC<BarChartProps> = ({ height={getContentHeight()} isSwitching={isSwitching} isMultiMissingFluid={ - d.valueDetail - ? d.valueDetail.includes(-1) - ? true - : false + d.state === DataloadState.AGGREGATED_WITH_EMPTY || + d.state === DataloadState.AGGREGATED_WITH_COMING || + d.state === DataloadState.AGGREGATED_WITH_HOLE_OR_MISSING + ? true : false } /> diff --git a/src/components/Charts/__snapshots__/AxisBottom.spec.tsx.snap b/src/components/Charts/__snapshots__/AxisBottom.spec.tsx.snap index 6586916e72db0fed35347ca763269925f8370f33..08178300f2b50684d832be691757d305c1ecb88d 100644 --- a/src/components/Charts/__snapshots__/AxisBottom.spec.tsx.snap +++ b/src/components/Charts/__snapshots__/AxisBottom.spec.tsx.snap @@ -19,24 +19,45 @@ exports[`AxisBottom component test should correctly render DAY format of AxisBot Array [ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], }, Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], }, Object { "date": "2020-10-03T00:00:00.000Z", + "state": "EMPTY", "value": -1, "valueDetail": null, }, @@ -72,24 +93,45 @@ exports[`AxisBottom component test should correctly render DAY format of AxisBot Array [ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], }, Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], }, Object { "date": "2020-10-03T00:00:00.000Z", + "state": "EMPTY", "value": -1, "valueDetail": null, }, @@ -124,24 +166,45 @@ exports[`AxisBottom component test should correctly render HALF_AN_HOUR format o Array [ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], }, Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], }, Object { "date": "2020-10-03T00:00:00.000Z", + "state": "EMPTY", "value": -1, "valueDetail": null, }, @@ -176,24 +239,45 @@ exports[`AxisBottom component test should correctly render MONTH format of AxisB Array [ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], }, Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], }, Object { "date": "2020-10-03T00:00:00.000Z", + "state": "EMPTY", "value": -1, "valueDetail": null, }, @@ -228,24 +312,45 @@ exports[`AxisBottom component test should correctly render WEEK format of AxisBo Array [ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], }, Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], }, Object { "date": "2020-10-03T00:00:00.000Z", + "state": "EMPTY", "value": -1, "valueDetail": null, }, @@ -280,24 +385,45 @@ exports[`AxisBottom component test should correctly render YEAR format of AxisBo Array [ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], }, Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], }, Object { "date": "2020-10-03T00:00:00.000Z", + "state": "EMPTY", "value": -1, "valueDetail": null, }, diff --git a/src/components/Charts/__snapshots__/Bar.spec.tsx.snap b/src/components/Charts/__snapshots__/Bar.spec.tsx.snap index c184d66626f97a124cc65ec17bc3979375885f2b..128c11396c52501b25a9457a280dbc78442b8f2d 100644 --- a/src/components/Charts/__snapshots__/Bar.spec.tsx.snap +++ b/src/components/Charts/__snapshots__/Bar.spec.tsx.snap @@ -18,22 +18,42 @@ exports[`Bar component test should correctly render Bar with isDuel 1`] = ` compareDataload={ Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], } } dataload={ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], } } @@ -69,22 +89,42 @@ exports[`Bar component test should correctly render Bar with isSwitching 1`] = ` compareDataload={ Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], } } dataload={ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], } } @@ -120,22 +160,42 @@ exports[`Bar component test should correctly render Bar with showCompare 1`] = ` compareDataload={ Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], } } dataload={ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], } } @@ -171,22 +231,42 @@ exports[`Bar component test should correctly render Electricity Bar 1`] = ` compareDataload={ Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], } } dataload={ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], } } @@ -222,22 +302,42 @@ exports[`Bar component test should correctly render Gas Bar 1`] = ` compareDataload={ Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], } } dataload={ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], } } @@ -273,22 +373,42 @@ exports[`Bar component test should correctly render Multifluid Bar 1`] = ` compareDataload={ Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], } } dataload={ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], } } @@ -324,22 +444,42 @@ exports[`Bar component test should correctly render Water Bar 1`] = ` compareDataload={ Object { "date": "2020-10-02T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 61.65554999999999, "valueDetail": Array [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + Object { + "state": "VALID", + "value": 40.21918999999999, + }, + Object { + "state": "VALID", + "value": 0.8064649999999999, + }, + Object { + "state": "VALID", + "value": 20.629894999999998, + }, ], } } dataload={ Object { "date": "2020-10-01T00:00:00.000Z", + "state": "AGGREGATED_VALID", "value": 69.18029999999999, "valueDetail": Array [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + Object { + "state": "VALID", + "value": 45.127739999999996, + }, + Object { + "state": "VALID", + "value": 0.9048899999999999, + }, + Object { + "state": "VALID", + "value": 23.147669999999998, + }, ], } } diff --git a/src/components/Connection/ConnectionResult.tsx b/src/components/Connection/ConnectionResult.tsx index dfccf4c755655b7892a759ba0f9998b365a1d78d..e3357ca96d3b9f8b4bcab6e701cb888cf51ccd5a 100644 --- a/src/components/Connection/ConnectionResult.tsx +++ b/src/components/Connection/ConnectionResult.tsx @@ -2,9 +2,12 @@ import React, { useState, useEffect, useCallback } from 'react' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { useClient } from 'cozy-client' import { useDispatch } from 'react-redux' -import { updatedFluidConnection } from 'store/global/global.actions' +import { + setShouldRefreshConsent, + updatedFluidConnection, +} from 'store/global/global.actions' -import { Account, FluidConnection, FluidStatus } from 'models' +import { Account, FluidConnection, FluidStatus, Trigger } from 'models' import AccountService from 'services/account.service' import { getKonnectorUpdateError } from 'utils/utils' @@ -14,10 +17,12 @@ import Button from '@material-ui/core/Button' import StyledBlackSpinner from 'components/CommonKit/Spinner/StyledBlackSpinner' import './connectionResult.scss' -import UsageEventService from 'services/usageEvent.service' import DateChartService from 'services/dateChart.service' import { FluidState, FluidType } from 'enum/fluid.enum' import { DateTime } from 'luxon' +import DeleteGRDFAccountModal from './DeleteGRDFAccountModal' +import TriggerService from 'services/triggers.service' +import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' interface ConnectionResultProps { fluidStatus: FluidStatus @@ -35,6 +40,7 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ const dispatch = useDispatch() const account: Account | null = fluidStatus.connection.account + const [deleting, setDeleting] = useState<boolean>(false) const [updating, setUpdating] = useState<boolean>(false) const [lastExecutionDate, setLastExecutionDate] = useState<string | DateTime>( '-' @@ -42,6 +48,12 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ const [konnectorError, setKonnectorError] = useState<string>('') const [status, setStatus] = useState<string>('') const [outDatedDataDays, setOutDatedDataDays] = useState<number | null>(null) + const [openGRDFDeletionModal, setOpenGRDFDeletionModal] = useState<boolean>( + false + ) + const toggleGRDFDeletionModal = useCallback(() => { + setOpenGRDFDeletionModal(prev => !prev) + }, []) const updateKonnector = async () => { setUpdating(true) @@ -57,21 +69,31 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ setUpdating(false) } - const deleteAccount = async () => { - setUpdating(true) + const deleteAccountsAndTriggers = useCallback(async () => { + setDeleting(true) try { if (account) { const accountService = new AccountService(client) - await accountService.deleteAccount(account) + const triggerService = new TriggerService(client) + const accounts: Account[] = await accountService.getAccountsByType( + account.account_type + ) + for (const _account of accounts) { + const trigger: Trigger | null = await triggerService.getTriggerForAccount( + _account + ) + if (trigger) await triggerService.deleteTrigger(trigger) + await accountService.deleteAccount(_account) + } await handleAccountDeletion() } } catch (error) { - setUpdating(false) + setDeleting(false) } - } + }, [account, client, handleAccountDeletion]) + const isOutdated = useCallback(() => { const dateChartService = new DateChartService() - return dateChartService.isDataOutdated(fluidStatus.lastDataDate, fluidType) }, [fluidStatus, fluidType]) @@ -91,6 +113,11 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ } }, [lastExecutionDate]) + const handleRefreshConsent = useCallback(() => { + deleteAccountsAndTriggers() + dispatch(setShouldRefreshConsent(true)) + }, [deleteAccountsAndTriggers, dispatch]) + useEffect(() => { if ( fluidStatus.connection.triggerState && @@ -113,7 +140,6 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ getKonnectorUpdateError(fluidStatus.connection.triggerState.last_error) ) } - if (isOutdated()) { setOutDatedDataDays(isOutdated()) } @@ -130,53 +156,17 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ : '' } > - {outDatedDataDays || fluidStatus.status === FluidState.PARTNER_ISSUE ? ( + {fluidStatus.status === FluidState.PARTNER_ISSUE ? ( + // First check if there is partner error from backoffice <div className="connection-caption text-16-normal"> <div className="text-16-normal"> - {fluidStatus.status === FluidState.PARTNER_ISSUE ? ( - <div className="connection-caption"> - {t('konnector_form.wait_end_issue')} - </div> - ) : ( - <> - {hasUpdatedToday() === true ? ( - <> - <div className="connection-caption"> - {t('konnector_form.label_updated_at')} - </div> - <div className="text-16-bold"> - {lastExecutionDate.toLocaleString()} - </div> - <div> - {fluidStatus && - fluidStatus.connection && - fluidStatus.connection.konnector && - t('konnector_form.issue') + - ' ' + - fluidStatus.connection.konnector.name + - '.'} - </div> - </> - ) : ( - <div className="connection-caption-errored connection-update-errored warning-white text-16-normal"> - <StyledIcon - icon={warningWhite} - size={36} - className="warning-icon" - role="img" - title="Attention" - ariaHidden={false} - /> - <div className="text-16-normal"> - {t('konnector_form.resolve')} - </div> - </div> - )} - </> - )} + <div className="connection-caption"> + {t('konnector_form.wait_end_issue')} + </div> </div> </div> ) : status === 'errored' ? ( + // Else check if konnector is in error state <div className="connection-caption-errored warning-white text-16-normal"> <StyledIcon icon={warningWhite} @@ -188,16 +178,71 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ /> <div className="text-16-normal"> - {t(`konnector_form.${konnectorError}`)} - <div className="connection-caption"> - {t('konnector_form.label_updated_at')} - </div> - <div className="text-16-bold"> - {lastExecutionDate.toLocaleString()} - </div> + {t(`konnector_form.${konnectorError}`, { + fluid: + fluidType === FluidType.GAS + ? 'de gaz' + : fluidType === FluidType.ELECTRICITY + ? "d'électricité" + : "d'eau", + })} + {konnectorError !== 'error_update_oauth' && ( + <> + <div className="connection-caption"> + {t('konnector_form.label_updated_at')} + </div> + <div className="text-16-bold"> + {lastExecutionDate.toLocaleString()} + </div> + </> + )} + </div> + </div> + ) : outDatedDataDays ? ( + // Else check if data is outdated + <div className="connection-caption text-16-normal"> + <div className="text-16-normal"> + <> + {hasUpdatedToday() === true ? ( + // If user has already ran an update today, display a message about energy provider issue + <> + <div className="connection-caption"> + {t('konnector_form.label_updated_at')} + </div> + <div className="text-16-bold"> + {lastExecutionDate.toLocaleString()} + </div> + <div> + {fluidStatus && + fluidStatus.connection && + fluidStatus.connection.konnector && + t('konnector_form.issue') + + ' ' + + fluidStatus.connection.konnector.name + + '.'} + </div> + </> + ) : ( + // Otherwise tells user to run a manual update + <div className="connection-caption-errored connection-update-errored warning-white text-16-normal"> + <StyledIcon + icon={warningWhite} + size={36} + className="warning-icon" + role="img" + title="Attention" + ariaHidden={false} + /> + <div className="text-16-normal"> + {t('konnector_form.resolve')} + </div> + </div> + )} + </> </div> </div> ) : ( + //If no partner error nor konnector error, display the last update date <div> <div className="connection-caption text-16-normal"> {t('konnector_form.label_updated_at')} @@ -211,31 +256,54 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ <div className="inline-buttons"> <Button aria-label={t('konnector_form.accessibility.button_delete')} - onClick={deleteAccount} - disabled={updating} + onClick={ + fluidType === FluidType.GAS + ? toggleGRDFDeletionModal + : deleteAccountsAndTriggers + } + disabled={updating || deleting} classes={{ root: 'btn-secondary-positive', label: 'text-16-normal', }} > - {t('konnector_form.button_delete')} + {deleting ? ( + <StyledSpinner size="1rem" fluidType={fluidType} /> + ) : ( + t('konnector_form.button_delete') + )} </Button> <Button aria-label={t('konnector_form.accessibility.button_update')} - onClick={updateKonnector} - disabled={updating} + onClick={ + konnectorError === 'error_update_oauth' + ? handleRefreshConsent + : updateKonnector + } + disabled={updating || deleting} classes={{ root: 'btn-highlight', label: 'text-16-bold', }} > {updating ? ( - <StyledBlackSpinner size="2em" /> + <StyledBlackSpinner size="1rem" /> ) : ( - <div>{t('konnector_form.button_update')}</div> + <div> + {konnectorError === 'error_update_oauth' + ? t('konnector_form.button_oauth_reload') + : t('konnector_form.button_update')} + </div> )} </Button> </div> + {fluidType === FluidType.GAS && ( + <DeleteGRDFAccountModal + open={openGRDFDeletionModal} + handleCloseClick={toggleGRDFDeletionModal} + deleteAccount={deleteAccountsAndTriggers} + /> + )} </div> ) } diff --git a/src/components/Connection/DeleteGRDFAccountModal.spec.tsx b/src/components/Connection/DeleteGRDFAccountModal.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..915201412ac71bf8bea5f7d2554752b6671fdbc2 --- /dev/null +++ b/src/components/Connection/DeleteGRDFAccountModal.spec.tsx @@ -0,0 +1,44 @@ +import React from 'react' +import { mount } from 'enzyme' +import toJson from 'enzyme-to-json' +import { Button } from '@material-ui/core' +import DeleteGRDFAccountModal from './DeleteGRDFAccountModal' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) + +describe('DeleteGRDFAccountModal component', () => { + it('should be rendered correctly', () => { + const component = mount( + <DeleteGRDFAccountModal + open={true} + handleCloseClick={jest.fn()} + deleteAccount={jest.fn()} + /> + ) + expect(toJson(component)).toMatchSnapshot() + }) + it('should launch the deletion process and close modal', () => { + const mockDelete = jest.fn() + const mockClose = jest.fn() + const component = mount( + <DeleteGRDFAccountModal + open={true} + handleCloseClick={mockClose} + deleteAccount={mockDelete} + /> + ) + component + .find(Button) + .at(1) + .simulate('click') + expect(mockDelete).toHaveBeenCalledTimes(1) + }) +}) diff --git a/src/components/Connection/DeleteGRDFAccountModal.tsx b/src/components/Connection/DeleteGRDFAccountModal.tsx new file mode 100644 index 0000000000000000000000000000000000000000..69eaa4b64dd06bdbb1aad05a3893d3a0ed30bce4 --- /dev/null +++ b/src/components/Connection/DeleteGRDFAccountModal.tsx @@ -0,0 +1,89 @@ +import React, { useCallback } from 'react' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Dialog from '@material-ui/core/Dialog' +import CloseIcon from 'assets/icons/ico/close.svg' +import GrdfIcon from 'assets/icons/ico/consent-outdated-grdf.svg' +import Icon from 'cozy-ui/transpiled/react/Icon' +import { Button, IconButton } from '@material-ui/core' +import './deleteGRDFAccountModal.scss' + +interface DeleteGRDFAccountModalProps { + open: boolean + handleCloseClick: () => void + deleteAccount: () => void +} + +const DeleteGRDFAccountModal: React.FC<DeleteGRDFAccountModalProps> = ({ + open, + handleCloseClick, + deleteAccount, +}: DeleteGRDFAccountModalProps) => { + const { t } = useI18n() + + const handleDelete = useCallback(() => { + deleteAccount() + handleCloseClick() + }, [deleteAccount, handleCloseClick]) + + return ( + <Dialog + open={open} + onClose={handleCloseClick} + aria-labelledby={'accessibility-title'} + classes={{ + root: 'modal-root', + paper: 'modal-paper', + }} + > + <div id={'accessibility-title'}> + {t('consumption_visualizer.modal.window_title')} + </div> + <IconButton + aria-label={t('consumption_visualizer.modal.close')} + className="modal-paper-close-button" + onClick={handleCloseClick} + > + <Icon icon={CloseIcon} size={16} /> + </IconButton> + <div className="delete-grdf-modal"> + <div className="icon-main"> + <Icon icon={GrdfIcon} size={135} /> + </div> + + <div className={`text-15-normal text1`}> + {t(`delete_grdf_modal.text1`)} + </div> + <div className="text-16-normal text2"> + {t(`delete_grdf_modal.text2`)} + </div> + <div className="text-15-normal text3"> + {t(`delete_grdf_modal.text3`)} + </div> + <div className="buttons"> + <Button + aria-label={t(`delete_grdf_modal.cancel`)} + onClick={handleCloseClick} + classes={{ + root: 'btn-secondary-positive', + label: 'text-16-normal', + }} + > + {t(`delete_grdf_modal.cancel`)} + </Button> + <Button + aria-label={t(`delete_grdf_modal.go`)} + onClick={handleDelete} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + > + {t(`delete_grdf_modal.go`)} + </Button> + </div> + </div> + </Dialog> + ) +} + +export default DeleteGRDFAccountModal diff --git a/src/components/Connection/ExpiredConsentModal.spec.tsx b/src/components/Connection/ExpiredConsentModal.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0f4931663ffa367e3b71262e2502828180057af7 --- /dev/null +++ b/src/components/Connection/ExpiredConsentModal.spec.tsx @@ -0,0 +1,68 @@ +import React from 'react' +import { mount } from 'enzyme' +import toJson from 'enzyme-to-json' +import ExpiredConsentModal from './ExpiredConsentModal' +import { FluidType } from 'enum/fluid.enum' +import { globalStateData } from '../../../tests/__mocks__/globalStateData.mock' +import { Provider } from 'react-redux' +import configureStore from 'redux-mock-store' +import { Button } from '@material-ui/core' +import * as reactRedux from 'react-redux' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) +const mockHistoryPush = jest.fn() +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), +})) + +const mockStore = configureStore([]) +describe('ExpiredConsentModal component', () => { + const store = mockStore({ + ecolyo: { + global: globalStateData, + }, + }) + it('should be rendered correctly', () => { + const component = mount( + <Provider store={store}> + <ExpiredConsentModal + open={true} + handleCloseClick={jest.fn()} + fluidType={FluidType.ELECTRICITY} + /> + </Provider> + ) + expect(toJson(component)).toMatchSnapshot() + }) + it('should launch the update consent process', () => { + const useDispatchSpy = jest.spyOn(reactRedux, 'useDispatch') + useDispatchSpy.mockReturnValue(jest.fn()) + + const component = mount( + <Provider store={store}> + <ExpiredConsentModal + open={true} + handleCloseClick={jest.fn()} + fluidType={FluidType.GAS} + /> + </Provider> + ) + component + .find(Button) + .at(1) + .simulate('click') + expect(useDispatchSpy).toHaveBeenCalledTimes(1) + expect(mockHistoryPush).toHaveBeenCalledTimes(1) + }) +}) diff --git a/src/components/Connection/ExpiredConsentModal.tsx b/src/components/Connection/ExpiredConsentModal.tsx new file mode 100644 index 0000000000000000000000000000000000000000..117fd283935295a3af8f30a516bf56d48d20d5b2 --- /dev/null +++ b/src/components/Connection/ExpiredConsentModal.tsx @@ -0,0 +1,103 @@ +import React, { useCallback } from 'react' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Dialog from '@material-ui/core/Dialog' +import CloseIcon from 'assets/icons/ico/close.svg' +import EnedisIcon from 'assets/icons/ico/consent-outdated-enedis.svg' +import GrdfIcon from 'assets/icons/ico/consent-outdated-grdf.svg' +import Icon from 'cozy-ui/transpiled/react/Icon' +import { Button, IconButton } from '@material-ui/core' +import { FluidType } from 'enum/fluid.enum' +import './expiredConsentModal.scss' +import { useHistory } from 'react-router-dom' +import { useDispatch } from 'react-redux' +import { setShouldRefreshConsent } from 'store/global/global.actions' + +interface ExpiredConsentModalProps { + open: boolean + handleCloseClick: () => void + fluidType: FluidType +} + +const ExpiredConsentModal: React.FC<ExpiredConsentModalProps> = ({ + open, + handleCloseClick, + fluidType, +}: ExpiredConsentModalProps) => { + const { t } = useI18n() + const history = useHistory() + const dispatch = useDispatch() + + const launchUpdateConsent = useCallback(() => { + dispatch(setShouldRefreshConsent(true)) + history.push(`/consumption/${FluidType[fluidType].toLocaleLowerCase()}`) + }, [dispatch, fluidType, history]) + + return ( + <Dialog + open={open} + onClose={handleCloseClick} + aria-labelledby={'accessibility-title'} + classes={{ + root: 'modal-root', + paper: 'modal-paper', + }} + > + <div id={'accessibility-title'}> + {t('consumption_visualizer.modal.window_title')} + </div> + <IconButton + aria-label={t('consumption_visualizer.modal.close')} + className="modal-paper-close-button" + onClick={handleCloseClick} + > + <Icon icon={CloseIcon} size={16} /> + </IconButton> + <div className="expired-consent-modal"> + <div className="icon-main"> + <Icon + icon={fluidType === FluidType.ELECTRICITY ? EnedisIcon : GrdfIcon} + size={135} + /> + </div> + + <div + className={`text-20-normal title ${FluidType[ + fluidType + ].toLowerCase()}`} + > + {t(`consent_outdated.title.${fluidType}`)} + </div> + <div className="text-16-normal text1"> + {t(`consent_outdated.text1.${fluidType}`)} + </div> + <div className="text-16-normal justified-text"> + {t(`consent_outdated.text2.${fluidType}`)} + </div> + <div className="buttons"> + <Button + aria-label={t('consent_outdated.later')} + onClick={handleCloseClick} + classes={{ + root: 'btn-secondary-positive', + label: 'text-16-normal', + }} + > + {t('consent_outdated.later')} + </Button> + <Button + aria-label={t('consent_outdated.go')} + onClick={launchUpdateConsent} + classes={{ + root: 'btn-highlight', + label: 'text-16-bold', + }} + > + {t('consent_outdated.go')} + </Button> + </div> + </div> + </Dialog> + ) +} + +export default ExpiredConsentModal diff --git a/src/components/Connection/FormOAuth.tsx b/src/components/Connection/FormOAuth.tsx index f781844b7c25fc9f3fc2b2f3451b99382c423bca..3be62fdb0518a240ac55cb6a29965799f8fb9f8c 100644 --- a/src/components/Connection/FormOAuth.tsx +++ b/src/components/Connection/FormOAuth.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useState } from 'react' +import React, { useCallback, useEffect, useState } from 'react' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { useClient } from 'cozy-client' import './auth.scss' @@ -8,6 +8,9 @@ import Button from '@material-ui/core/Button' import StyledIcon from 'components/CommonKit/Icon/StyledIcon' import StyledBlackSpinner from 'components/CommonKit/Spinner/StyledBlackSpinner' import { getPartnerPicto } from 'utils/picto' +import { useDispatch, useSelector } from 'react-redux' +import { AppStore } from 'store' +import { setShouldRefreshConsent } from 'store/global/global.actions' interface FormOAuthProps { konnector: Konnector | null @@ -26,10 +29,15 @@ const FormOAuth: React.FC<FormOAuthProps> = ({ const { t } = useI18n() const client = useClient() const [status, setStatus] = useState<string>(IDLE) - + const { shouldRefreshConsent } = useSelector( + (state: AppStore) => state.ecolyo.global + ) + 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) + dispatch(setShouldRefreshConsent(false)) + }, [dispatch]) const startOAuth = useCallback(() => { setStatus(WAITING) @@ -53,9 +61,17 @@ const FormOAuth: React.FC<FormOAuthProps> = ({ ) const isWaiting = status === WAITING + useEffect(() => { + if (shouldRefreshConsent) { + // If user has selected accept button on Expired consent modal, his account has been deleted on KonnectorViewerCard, such as his consent (for GRDF), then automatically launch oauth connxion flow + startOAuth() + } + }, [shouldRefreshConsent, startOAuth]) + if (!konnector) { return null } + return ( <> <Button diff --git a/src/components/Connection/__snapshots__/Connection.spec.tsx.snap b/src/components/Connection/__snapshots__/Connection.spec.tsx.snap index c252168a373d53b784409c59b5359353c938b039..990ba1c0eea23080bf48922657c3ce3bba03515a 100644 --- a/src/components/Connection/__snapshots__/Connection.spec.tsx.snap +++ b/src/components/Connection/__snapshots__/Connection.spec.tsx.snap @@ -19,6 +19,7 @@ exports[`Connection component test should call ConnectionLogin 1`] = ` "trigger": null, "triggerState": null, }, + "firstDataDate": "2019-09-01T00:00:00.000Z", "fluidType": 0, "lastDataDate": "2020-09-01T00:00:00.000Z", "status": 200, @@ -46,6 +47,7 @@ exports[`Connection component test should call ConnectionLogin 1`] = ` "trigger": null, "triggerState": null, }, + "firstDataDate": "2019-09-01T00:00:00.000Z", "fluidType": 0, "lastDataDate": "2020-09-01T00:00:00.000Z", "status": 200, @@ -80,6 +82,7 @@ exports[`Connection component test should call ConnectionOAuth 1`] = ` "trigger": null, "triggerState": null, }, + "firstDataDate": "2019-09-01T00:00:00.000Z", "fluidType": 2, "lastDataDate": "2020-09-01T00:00:00.000Z", "status": 200, @@ -107,6 +110,7 @@ exports[`Connection component test should call ConnectionOAuth 1`] = ` "trigger": null, "triggerState": null, }, + "firstDataDate": "2019-09-01T00:00:00.000Z", "fluidType": 2, "lastDataDate": "2020-09-01T00:00:00.000Z", "status": 200, diff --git a/src/components/Connection/__snapshots__/DeleteGRDFAccountModal.spec.tsx.snap b/src/components/Connection/__snapshots__/DeleteGRDFAccountModal.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..9836a6dbdffcac33733a3a4802584bb3bcc2ea8e --- /dev/null +++ b/src/components/Connection/__snapshots__/DeleteGRDFAccountModal.spec.tsx.snap @@ -0,0 +1,1170 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`DeleteGRDFAccountModal component should be rendered correctly 1`] = ` +<DeleteGRDFAccountModal + deleteAccount={[MockFunction]} + handleCloseClick={[MockFunction]} + open={true} +> + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "hover": "rgba(0, 0, 0, 0.08)", + "hoverOpacity": 0.08, + "selected": "rgba(0, 0, 0, 0.14)", + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableBackdropClick={false} + disableEscapeKeyDown={false} + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Portal) + disablePortal={false} + > + <Portal + containerInfo={ + <body + style="padding-right: 0px; overflow: hidden;" + > + <div + class="MuiDialog-root modal-root" + role="presentation" + style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;" + > + <div + aria-hidden="true" + class="MuiBackdrop-root" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + /> + <div + data-test="sentinelStart" + tabindex="0" + /> + <div + class="MuiDialog-container MuiDialog-scrollPaper" + role="none presentation" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + tabindex="-1" + > + <div + aria-labelledby="accessibility-title" + class="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + consumption_visualizer.modal.window_title + </div> + <button + aria-label="consumption_visualizer.modal.close" + class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + tabindex="0" + type="button" + > + <span + class="MuiIconButton-label" + > + <svg + class="styles__icon___23x3R" + height="16" + width="16" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + <div + class="delete-grdf-modal" + > + <div + class="icon-main" + > + <svg + class="styles__icon___23x3R" + height="135" + width="135" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </div> + <div + class="text-15-normal text1" + > + delete_grdf_modal.text1 + </div> + <div + class="text-16-normal text2" + > + delete_grdf_modal.text2 + </div> + <div + class="text-15-normal text3" + > + delete_grdf_modal.text3 + </div> + <div + class="buttons" + > + <button + aria-label="delete_grdf_modal.cancel" + class="MuiButtonBase-root MuiButton-root btn-secondary-positive MuiButton-text" + tabindex="0" + type="button" + > + <span + class="MuiButton-label text-16-normal" + > + delete_grdf_modal.cancel + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + <button + aria-label="delete_grdf_modal.go" + class="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + tabindex="0" + type="button" + > + <span + class="MuiButton-label text-16-bold" + > + delete_grdf_modal.go + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + </div> + </div> + </div> + </div> + <div + data-test="sentinelEnd" + tabindex="0" + /> + </div> + </body> + } + > + <div + className="MuiDialog-root modal-root" + onKeyDown={[Function]} + role="presentation" + style={ + Object { + "bottom": 0, + "left": 0, + "position": "fixed", + "right": 0, + "top": 0, + "zIndex": 1300, + } + } + > + <WithStyles(ForwardRef(Backdrop)) + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Backdrop) + classes={ + Object { + "invisible": "MuiBackdrop-invisible", + "root": "MuiBackdrop-root", + } + } + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Fade) + in={true} + onClick={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onClick={[Function]} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + aria-hidden={true} + className="MuiBackdrop-root" + onClick={[Function]} + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + /> + </Transition> + </ForwardRef(Fade)> + </ForwardRef(Backdrop)> + </WithStyles(ForwardRef(Backdrop))> + <TrapFocus + disableAutoFocus={false} + disableEnforceFocus={false} + disableRestoreFocus={false} + getDoc={[Function]} + isEnabled={[Function]} + open={true} + > + <div + data-test="sentinelStart" + tabIndex={0} + /> + <ForwardRef(Fade) + appear={true} + in={true} + onEnter={[Function]} + onExited={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + className="MuiDialog-container MuiDialog-scrollPaper" + onClick={[Function]} + onMouseDown={[Function]} + role="none presentation" + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + tabIndex="-1" + > + <WithStyles(ForwardRef(Paper)) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + elevation={24} + role="dialog" + > + <ForwardRef(Paper) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + classes={ + Object { + "elevation0": "MuiPaper-elevation0", + "elevation1": "MuiPaper-elevation1", + "elevation10": "MuiPaper-elevation10", + "elevation11": "MuiPaper-elevation11", + "elevation12": "MuiPaper-elevation12", + "elevation13": "MuiPaper-elevation13", + "elevation14": "MuiPaper-elevation14", + "elevation15": "MuiPaper-elevation15", + "elevation16": "MuiPaper-elevation16", + "elevation17": "MuiPaper-elevation17", + "elevation18": "MuiPaper-elevation18", + "elevation19": "MuiPaper-elevation19", + "elevation2": "MuiPaper-elevation2", + "elevation20": "MuiPaper-elevation20", + "elevation21": "MuiPaper-elevation21", + "elevation22": "MuiPaper-elevation22", + "elevation23": "MuiPaper-elevation23", + "elevation24": "MuiPaper-elevation24", + "elevation3": "MuiPaper-elevation3", + "elevation4": "MuiPaper-elevation4", + "elevation5": "MuiPaper-elevation5", + "elevation6": "MuiPaper-elevation6", + "elevation7": "MuiPaper-elevation7", + "elevation8": "MuiPaper-elevation8", + "elevation9": "MuiPaper-elevation9", + "outlined": "MuiPaper-outlined", + "root": "MuiPaper-root", + "rounded": "MuiPaper-rounded", + } + } + elevation={24} + role="dialog" + > + <div + aria-labelledby="accessibility-title" + className="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + consumption_visualizer.modal.window_title + </div> + <WithStyles(ForwardRef(IconButton)) + aria-label="consumption_visualizer.modal.close" + className="modal-paper-close-button" + onClick={[MockFunction]} + > + <ForwardRef(IconButton) + aria-label="consumption_visualizer.modal.close" + className="modal-paper-close-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="consumption_visualizer.modal.close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <ForwardRef(ButtonBase) + aria-label="consumption_visualizer.modal.close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <button + aria-label="consumption_visualizer.modal.close" + className="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <Icon + icon="test-file-stub" + size={16} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <svg + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <NoSsr> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </NoSsr> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + <div + className="delete-grdf-modal" + > + <div + className="icon-main" + > + <Icon + icon="test-file-stub" + size={135} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={135} + style={Object {}} + width={135} + > + <svg + className="styles__icon___23x3R" + height={135} + style={Object {}} + width={135} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </div> + <div + className="text-15-normal text1" + > + delete_grdf_modal.text1 + </div> + <div + className="text-16-normal text2" + > + delete_grdf_modal.text2 + </div> + <div + className="text-15-normal text3" + > + delete_grdf_modal.text3 + </div> + <div + className="buttons" + > + <WithStyles(ForwardRef(Button)) + aria-label="delete_grdf_modal.cancel" + classes={ + Object { + "label": "text-16-normal", + "root": "btn-secondary-positive", + } + } + onClick={[MockFunction]} + > + <ForwardRef(Button) + aria-label="delete_grdf_modal.cancel" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-normal", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-secondary-positive", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="delete_grdf_modal.cancel" + className="MuiButton-root btn-secondary-positive MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="delete_grdf_modal.cancel" + className="MuiButton-root btn-secondary-positive MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + type="button" + > + <button + aria-label="delete_grdf_modal.cancel" + className="MuiButtonBase-root MuiButton-root btn-secondary-positive MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-normal" + > + delete_grdf_modal.cancel + </span> + <NoSsr> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </NoSsr> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + <WithStyles(ForwardRef(Button)) + aria-label="delete_grdf_modal.go" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight", + } + } + onClick={[Function]} + > + <ForwardRef(Button) + aria-label="delete_grdf_modal.go" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="delete_grdf_modal.go" + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="delete_grdf_modal.go" + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="delete_grdf_modal.go" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + delete_grdf_modal.go + </span> + <NoSsr> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </NoSsr> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </div> + </div> + </ForwardRef(Paper)> + </WithStyles(ForwardRef(Paper))> + </div> + </Transition> + </ForwardRef(Fade)> + <div + data-test="sentinelEnd" + tabIndex={0} + /> + </TrapFocus> + </div> + </Portal> + </ForwardRef(Portal)> + </ForwardRef(Modal)> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> +</DeleteGRDFAccountModal> +`; diff --git a/src/components/Connection/__snapshots__/ExpiredConsentModal.spec.tsx.snap b/src/components/Connection/__snapshots__/ExpiredConsentModal.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..1e18710ba52c158356a14fcf9c967ff362f63084 --- /dev/null +++ b/src/components/Connection/__snapshots__/ExpiredConsentModal.spec.tsx.snap @@ -0,0 +1,1183 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ExpiredConsentModal component should be rendered correctly 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <ExpiredConsentModal + fluidType={0} + handleCloseClick={[MockFunction]} + open={true} + > + <WithStyles(ForwardRef(Dialog)) + aria-labelledby="accessibility-title" + classes={ + Object { + "paper": "modal-paper", + "root": "modal-root", + } + } + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Dialog) + aria-labelledby="accessibility-title" + classes={ + Object { + "container": "MuiDialog-container", + "paper": "MuiDialog-paper modal-paper", + "paperFullScreen": "MuiDialog-paperFullScreen", + "paperFullWidth": "MuiDialog-paperFullWidth", + "paperScrollBody": "MuiDialog-paperScrollBody", + "paperScrollPaper": "MuiDialog-paperScrollPaper", + "paperWidthFalse": "MuiDialog-paperWidthFalse", + "paperWidthLg": "MuiDialog-paperWidthLg", + "paperWidthMd": "MuiDialog-paperWidthMd", + "paperWidthSm": "MuiDialog-paperWidthSm", + "paperWidthXl": "MuiDialog-paperWidthXl", + "paperWidthXs": "MuiDialog-paperWidthXs", + "root": "MuiDialog-root modal-root", + "scrollBody": "MuiDialog-scrollBody", + "scrollPaper": "MuiDialog-scrollPaper", + } + } + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Modal) + BackdropComponent={ + Object { + "$$typeof": Symbol(react.forward_ref), + "Naked": Object { + "$$typeof": Symbol(react.forward_ref), + "propTypes": Object { + "children": [Function], + "className": [Function], + "classes": [Function], + "invisible": [Function], + "open": [Function], + "transitionDuration": [Function], + }, + "render": [Function], + }, + "displayName": "WithStyles(ForwardRef(Backdrop))", + "options": Object { + "defaultTheme": Object { + "breakpoints": Object { + "between": [Function], + "down": [Function], + "keys": Array [ + "xs", + "sm", + "md", + "lg", + "xl", + ], + "only": [Function], + "up": [Function], + "values": Object { + "lg": 1280, + "md": 960, + "sm": 600, + "xl": 1920, + "xs": 0, + }, + "width": [Function], + }, + "direction": "ltr", + "mixins": Object { + "gutters": [Function], + "toolbar": Object { + "@media (min-width:0px) and (orientation: landscape)": Object { + "minHeight": 48, + }, + "@media (min-width:600px)": Object { + "minHeight": 64, + }, + "minHeight": 56, + }, + }, + "overrides": Object {}, + "palette": Object { + "action": Object { + "active": "rgba(0, 0, 0, 0.54)", + "disabled": "rgba(0, 0, 0, 0.26)", + "disabledBackground": "rgba(0, 0, 0, 0.12)", + "hover": "rgba(0, 0, 0, 0.08)", + "hoverOpacity": 0.08, + "selected": "rgba(0, 0, 0, 0.14)", + }, + "augmentColor": [Function], + "background": Object { + "default": "#fafafa", + "paper": "#fff", + }, + "common": Object { + "black": "#000", + "white": "#fff", + }, + "contrastThreshold": 3, + "divider": "rgba(0, 0, 0, 0.12)", + "error": Object { + "contrastText": "#fff", + "dark": "#d32f2f", + "light": "#e57373", + "main": "#f44336", + }, + "getContrastText": [Function], + "grey": Object { + "100": "#f5f5f5", + "200": "#eeeeee", + "300": "#e0e0e0", + "400": "#bdbdbd", + "50": "#fafafa", + "500": "#9e9e9e", + "600": "#757575", + "700": "#616161", + "800": "#424242", + "900": "#212121", + "A100": "#d5d5d5", + "A200": "#aaaaaa", + "A400": "#303030", + "A700": "#616161", + }, + "info": Object { + "contrastText": "#fff", + "dark": "#1976d2", + "light": "#64b5f6", + "main": "#2196f3", + }, + "primary": Object { + "contrastText": "#fff", + "dark": "#303f9f", + "light": "#7986cb", + "main": "#3f51b5", + }, + "secondary": Object { + "contrastText": "#fff", + "dark": "#c51162", + "light": "#ff4081", + "main": "#f50057", + }, + "success": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#388e3c", + "light": "#81c784", + "main": "#4caf50", + }, + "text": Object { + "disabled": "rgba(0, 0, 0, 0.38)", + "hint": "rgba(0, 0, 0, 0.38)", + "primary": "rgba(0, 0, 0, 0.87)", + "secondary": "rgba(0, 0, 0, 0.54)", + }, + "tonalOffset": 0.2, + "type": "light", + "warning": Object { + "contrastText": "rgba(0, 0, 0, 0.87)", + "dark": "#f57c00", + "light": "#ffb74d", + "main": "#ff9800", + }, + }, + "props": Object {}, + "shadows": Array [ + "none", + "0px 2px 1px -1px rgba(0,0,0,0.2),0px 1px 1px 0px rgba(0,0,0,0.14),0px 1px 3px 0px rgba(0,0,0,0.12)", + "0px 3px 1px -2px rgba(0,0,0,0.2),0px 2px 2px 0px rgba(0,0,0,0.14),0px 1px 5px 0px rgba(0,0,0,0.12)", + "0px 3px 3px -2px rgba(0,0,0,0.2),0px 3px 4px 0px rgba(0,0,0,0.14),0px 1px 8px 0px rgba(0,0,0,0.12)", + "0px 2px 4px -1px rgba(0,0,0,0.2),0px 4px 5px 0px rgba(0,0,0,0.14),0px 1px 10px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 5px 8px 0px rgba(0,0,0,0.14),0px 1px 14px 0px rgba(0,0,0,0.12)", + "0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)", + "0px 4px 5px -2px rgba(0,0,0,0.2),0px 7px 10px 1px rgba(0,0,0,0.14),0px 2px 16px 1px rgba(0,0,0,0.12)", + "0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)", + "0px 5px 6px -3px rgba(0,0,0,0.2),0px 9px 12px 1px rgba(0,0,0,0.14),0px 3px 16px 2px rgba(0,0,0,0.12)", + "0px 6px 6px -3px rgba(0,0,0,0.2),0px 10px 14px 1px rgba(0,0,0,0.14),0px 4px 18px 3px rgba(0,0,0,0.12)", + "0px 6px 7px -4px rgba(0,0,0,0.2),0px 11px 15px 1px rgba(0,0,0,0.14),0px 4px 20px 3px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 12px 17px 2px rgba(0,0,0,0.14),0px 5px 22px 4px rgba(0,0,0,0.12)", + "0px 7px 8px -4px rgba(0,0,0,0.2),0px 13px 19px 2px rgba(0,0,0,0.14),0px 5px 24px 4px rgba(0,0,0,0.12)", + "0px 7px 9px -4px rgba(0,0,0,0.2),0px 14px 21px 2px rgba(0,0,0,0.14),0px 5px 26px 4px rgba(0,0,0,0.12)", + "0px 8px 9px -5px rgba(0,0,0,0.2),0px 15px 22px 2px rgba(0,0,0,0.14),0px 6px 28px 5px rgba(0,0,0,0.12)", + "0px 8px 10px -5px rgba(0,0,0,0.2),0px 16px 24px 2px rgba(0,0,0,0.14),0px 6px 30px 5px rgba(0,0,0,0.12)", + "0px 8px 11px -5px rgba(0,0,0,0.2),0px 17px 26px 2px rgba(0,0,0,0.14),0px 6px 32px 5px rgba(0,0,0,0.12)", + "0px 9px 11px -5px rgba(0,0,0,0.2),0px 18px 28px 2px rgba(0,0,0,0.14),0px 7px 34px 6px rgba(0,0,0,0.12)", + "0px 9px 12px -6px rgba(0,0,0,0.2),0px 19px 29px 2px rgba(0,0,0,0.14),0px 7px 36px 6px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 20px 31px 3px rgba(0,0,0,0.14),0px 8px 38px 7px rgba(0,0,0,0.12)", + "0px 10px 13px -6px rgba(0,0,0,0.2),0px 21px 33px 3px rgba(0,0,0,0.14),0px 8px 40px 7px rgba(0,0,0,0.12)", + "0px 10px 14px -6px rgba(0,0,0,0.2),0px 22px 35px 3px rgba(0,0,0,0.14),0px 8px 42px 7px rgba(0,0,0,0.12)", + "0px 11px 14px -7px rgba(0,0,0,0.2),0px 23px 36px 3px rgba(0,0,0,0.14),0px 9px 44px 8px rgba(0,0,0,0.12)", + "0px 11px 15px -7px rgba(0,0,0,0.2),0px 24px 38px 3px rgba(0,0,0,0.14),0px 9px 46px 8px rgba(0,0,0,0.12)", + ], + "shape": Object { + "borderRadius": 4, + }, + "spacing": [Function], + "transitions": Object { + "create": [Function], + "duration": Object { + "complex": 375, + "enteringScreen": 225, + "leavingScreen": 195, + "short": 250, + "shorter": 200, + "shortest": 150, + "standard": 300, + }, + "easing": Object { + "easeIn": "cubic-bezier(0.4, 0, 1, 1)", + "easeInOut": "cubic-bezier(0.4, 0, 0.2, 1)", + "easeOut": "cubic-bezier(0.0, 0, 0.2, 1)", + "sharp": "cubic-bezier(0.4, 0, 0.6, 1)", + }, + "getAutoHeightDuration": [Function], + }, + "typography": Object { + "body1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.5, + }, + "body2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 400, + "letterSpacing": "0.01071em", + "lineHeight": 1.43, + }, + "button": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.02857em", + "lineHeight": 1.75, + "textTransform": "uppercase", + }, + "caption": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.03333em", + "lineHeight": 1.66, + }, + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": 14, + "fontWeightBold": 700, + "fontWeightLight": 300, + "fontWeightMedium": 500, + "fontWeightRegular": 400, + "h1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "6rem", + "fontWeight": 300, + "letterSpacing": "-0.01562em", + "lineHeight": 1.167, + }, + "h2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3.75rem", + "fontWeight": 300, + "letterSpacing": "-0.00833em", + "lineHeight": 1.2, + }, + "h3": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "3rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.167, + }, + "h4": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "2.125rem", + "fontWeight": 400, + "letterSpacing": "0.00735em", + "lineHeight": 1.235, + }, + "h5": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.5rem", + "fontWeight": 400, + "letterSpacing": "0em", + "lineHeight": 1.334, + }, + "h6": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1.25rem", + "fontWeight": 500, + "letterSpacing": "0.0075em", + "lineHeight": 1.6, + }, + "htmlFontSize": 16, + "overline": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.75rem", + "fontWeight": 400, + "letterSpacing": "0.08333em", + "lineHeight": 2.66, + "textTransform": "uppercase", + }, + "pxToRem": [Function], + "round": [Function], + "subtitle1": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "1rem", + "fontWeight": 400, + "letterSpacing": "0.00938em", + "lineHeight": 1.75, + }, + "subtitle2": Object { + "fontFamily": "\\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", + "fontSize": "0.875rem", + "fontWeight": 500, + "letterSpacing": "0.00714em", + "lineHeight": 1.57, + }, + }, + "zIndex": Object { + "appBar": 1100, + "drawer": 1200, + "mobileStepper": 1000, + "modal": 1300, + "snackbar": 1400, + "speedDial": 1050, + "tooltip": 1500, + }, + }, + "name": "MuiBackdrop", + }, + "propTypes": Object { + "classes": [Function], + "innerRef": [Function], + }, + "render": [Function], + "useStyles": [Function], + } + } + BackdropProps={ + Object { + "transitionDuration": Object { + "enter": 225, + "exit": 195, + }, + } + } + className="MuiDialog-root modal-root" + closeAfterTransition={true} + disableBackdropClick={false} + disableEscapeKeyDown={false} + onClose={[MockFunction]} + open={true} + > + <ForwardRef(Portal) + disablePortal={false} + > + <Portal + containerInfo={ + <body + style="padding-right: 0px; overflow: hidden;" + > + <div + class="MuiDialog-root modal-root" + role="presentation" + style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;" + > + <div + aria-hidden="true" + class="MuiBackdrop-root" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + /> + <div + data-test="sentinelStart" + tabindex="0" + /> + <div + class="MuiDialog-container MuiDialog-scrollPaper" + role="none presentation" + style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;" + tabindex="-1" + > + <div + aria-labelledby="accessibility-title" + class="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + consumption_visualizer.modal.window_title + </div> + <button + aria-label="consumption_visualizer.modal.close" + class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + tabindex="0" + type="button" + > + <span + class="MuiIconButton-label" + > + <svg + class="styles__icon___23x3R" + height="16" + width="16" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + <div + class="expired-consent-modal" + > + <div + class="icon-main" + > + <svg + class="styles__icon___23x3R" + height="135" + width="135" + > + <use + xlink:href="#test-file-stub" + /> + </svg> + </div> + <div + class="text-20-normal title electricity" + > + consent_outdated.title.0 + </div> + <div + class="text-16-normal text1" + > + consent_outdated.text1.0 + </div> + <div + class="text-16-normal justified-text" + > + consent_outdated.text2.0 + </div> + <div + class="buttons" + > + <button + aria-label="consent_outdated.later" + class="MuiButtonBase-root MuiButton-root btn-secondary-positive MuiButton-text" + tabindex="0" + type="button" + > + <span + class="MuiButton-label text-16-normal" + > + consent_outdated.later + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + <button + aria-label="consent_outdated.go" + class="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + tabindex="0" + type="button" + > + <span + class="MuiButton-label text-16-bold" + > + consent_outdated.go + </span> + <span + class="MuiTouchRipple-root" + /> + </button> + </div> + </div> + </div> + </div> + <div + data-test="sentinelEnd" + tabindex="0" + /> + </div> + </body> + } + > + <div + className="MuiDialog-root modal-root" + onKeyDown={[Function]} + role="presentation" + style={ + Object { + "bottom": 0, + "left": 0, + "position": "fixed", + "right": 0, + "top": 0, + "zIndex": 1300, + } + } + > + <WithStyles(ForwardRef(Backdrop)) + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Backdrop) + classes={ + Object { + "invisible": "MuiBackdrop-invisible", + "root": "MuiBackdrop-root", + } + } + onClick={[Function]} + open={true} + transitionDuration={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <ForwardRef(Fade) + in={true} + onClick={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onClick={[Function]} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + aria-hidden={true} + className="MuiBackdrop-root" + onClick={[Function]} + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + /> + </Transition> + </ForwardRef(Fade)> + </ForwardRef(Backdrop)> + </WithStyles(ForwardRef(Backdrop))> + <TrapFocus + disableAutoFocus={false} + disableEnforceFocus={false} + disableRestoreFocus={false} + getDoc={[Function]} + isEnabled={[Function]} + open={true} + > + <div + data-test="sentinelStart" + tabIndex={0} + /> + <ForwardRef(Fade) + appear={true} + in={true} + onEnter={[Function]} + onExited={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + > + <Transition + appear={true} + enter={true} + exit={true} + in={true} + mountOnEnter={false} + onEnter={[Function]} + onEntered={[Function]} + onEntering={[Function]} + onExit={[Function]} + onExited={[Function]} + onExiting={[Function]} + role="none presentation" + tabIndex="-1" + timeout={ + Object { + "enter": 225, + "exit": 195, + } + } + unmountOnExit={false} + > + <div + className="MuiDialog-container MuiDialog-scrollPaper" + onClick={[Function]} + onMouseDown={[Function]} + role="none presentation" + style={ + Object { + "opacity": 1, + "visibility": undefined, + } + } + tabIndex="-1" + > + <WithStyles(ForwardRef(Paper)) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + elevation={24} + role="dialog" + > + <ForwardRef(Paper) + aria-labelledby="accessibility-title" + className="MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm" + classes={ + Object { + "elevation0": "MuiPaper-elevation0", + "elevation1": "MuiPaper-elevation1", + "elevation10": "MuiPaper-elevation10", + "elevation11": "MuiPaper-elevation11", + "elevation12": "MuiPaper-elevation12", + "elevation13": "MuiPaper-elevation13", + "elevation14": "MuiPaper-elevation14", + "elevation15": "MuiPaper-elevation15", + "elevation16": "MuiPaper-elevation16", + "elevation17": "MuiPaper-elevation17", + "elevation18": "MuiPaper-elevation18", + "elevation19": "MuiPaper-elevation19", + "elevation2": "MuiPaper-elevation2", + "elevation20": "MuiPaper-elevation20", + "elevation21": "MuiPaper-elevation21", + "elevation22": "MuiPaper-elevation22", + "elevation23": "MuiPaper-elevation23", + "elevation24": "MuiPaper-elevation24", + "elevation3": "MuiPaper-elevation3", + "elevation4": "MuiPaper-elevation4", + "elevation5": "MuiPaper-elevation5", + "elevation6": "MuiPaper-elevation6", + "elevation7": "MuiPaper-elevation7", + "elevation8": "MuiPaper-elevation8", + "elevation9": "MuiPaper-elevation9", + "outlined": "MuiPaper-outlined", + "root": "MuiPaper-root", + "rounded": "MuiPaper-rounded", + } + } + elevation={24} + role="dialog" + > + <div + aria-labelledby="accessibility-title" + className="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded" + role="dialog" + > + <div + id="accessibility-title" + > + consumption_visualizer.modal.window_title + </div> + <WithStyles(ForwardRef(IconButton)) + aria-label="consumption_visualizer.modal.close" + className="modal-paper-close-button" + onClick={[MockFunction]} + > + <ForwardRef(IconButton) + aria-label="consumption_visualizer.modal.close" + className="modal-paper-close-button" + classes={ + Object { + "colorInherit": "MuiIconButton-colorInherit", + "colorPrimary": "MuiIconButton-colorPrimary", + "colorSecondary": "MuiIconButton-colorSecondary", + "disabled": "Mui-disabled", + "edgeEnd": "MuiIconButton-edgeEnd", + "edgeStart": "MuiIconButton-edgeStart", + "label": "MuiIconButton-label", + "root": "MuiIconButton-root", + "sizeSmall": "MuiIconButton-sizeSmall", + } + } + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="consumption_visualizer.modal.close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <ForwardRef(ButtonBase) + aria-label="consumption_visualizer.modal.close" + centerRipple={true} + className="MuiIconButton-root modal-paper-close-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + disabled={false} + focusRipple={true} + onClick={[MockFunction]} + > + <button + aria-label="consumption_visualizer.modal.close" + className="MuiButtonBase-root MuiIconButton-root modal-paper-close-button" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiIconButton-label" + > + <Icon + icon="test-file-stub" + size={16} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <svg + className="styles__icon___23x3R" + height={16} + style={Object {}} + width={16} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </span> + <NoSsr> + <WithStyles(memo) + center={true} + > + <ForwardRef(TouchRipple) + center={true} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </NoSsr> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(IconButton)> + </WithStyles(ForwardRef(IconButton))> + <div + className="expired-consent-modal" + > + <div + className="icon-main" + > + <Icon + icon="test-file-stub" + size={135} + spin={false} + > + <Component + className="styles__icon___23x3R" + height={135} + style={Object {}} + width={135} + > + <svg + className="styles__icon___23x3R" + height={135} + style={Object {}} + width={135} + > + <use + xlinkHref="#test-file-stub" + /> + </svg> + </Component> + </Icon> + </div> + <div + className="text-20-normal title electricity" + > + consent_outdated.title.0 + </div> + <div + className="text-16-normal text1" + > + consent_outdated.text1.0 + </div> + <div + className="text-16-normal justified-text" + > + consent_outdated.text2.0 + </div> + <div + className="buttons" + > + <WithStyles(ForwardRef(Button)) + aria-label="consent_outdated.later" + classes={ + Object { + "label": "text-16-normal", + "root": "btn-secondary-positive", + } + } + onClick={[MockFunction]} + > + <ForwardRef(Button) + aria-label="consent_outdated.later" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-normal", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-secondary-positive", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[MockFunction]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="consent_outdated.later" + className="MuiButton-root btn-secondary-positive MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="consent_outdated.later" + className="MuiButton-root btn-secondary-positive MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[MockFunction]} + type="button" + > + <button + aria-label="consent_outdated.later" + className="MuiButtonBase-root MuiButton-root btn-secondary-positive MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[MockFunction]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-normal" + > + consent_outdated.later + </span> + <NoSsr> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </NoSsr> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + <WithStyles(ForwardRef(Button)) + aria-label="consent_outdated.go" + classes={ + Object { + "label": "text-16-bold", + "root": "btn-highlight", + } + } + onClick={[Function]} + > + <ForwardRef(Button) + aria-label="consent_outdated.go" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="consent_outdated.go" + className="MuiButton-root btn-highlight MuiButton-text" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="consent_outdated.go" + className="MuiButton-root btn-highlight MuiButton-text" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="consent_outdated.go" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + consent_outdated.go + </span> + <NoSsr> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </NoSsr> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> + </WithStyles(ForwardRef(Button))> + </div> + </div> + </div> + </ForwardRef(Paper)> + </WithStyles(ForwardRef(Paper))> + </div> + </Transition> + </ForwardRef(Fade)> + <div + data-test="sentinelEnd" + tabIndex={0} + /> + </TrapFocus> + </div> + </Portal> + </ForwardRef(Portal)> + </ForwardRef(Modal)> + </ForwardRef(Dialog)> + </WithStyles(ForwardRef(Dialog))> + </ExpiredConsentModal> +</Provider> +`; diff --git a/src/components/Connection/connectionResult.scss b/src/components/Connection/connectionResult.scss index cf5f6477a5d5914c15f78385e3041f8cd2fab937..8d4e5d1ada012afebae7e5115840670f8169f4c4 100644 --- a/src/components/Connection/connectionResult.scss +++ b/src/components/Connection/connectionResult.scss @@ -7,7 +7,8 @@ @media #{$tablet} { margin: 0 0 0.25rem; } - .connection-update-errored { + .connection-update-errored, + .connection-caption-errored { background-color: $red-primary; margin: 0 -2.5rem; padding: 0.4rem 2.5rem; @@ -17,11 +18,7 @@ margin: 0 -1.2rem; padding: 0.4rem 1.2rem; } - .connection-caption-errored { - display: flex; - align-items: center; - color: $grey-bright; - } + .warning-icon { margin-right: 1rem; } diff --git a/src/components/Connection/deleteGRDFAccountModal.scss b/src/components/Connection/deleteGRDFAccountModal.scss new file mode 100644 index 0000000000000000000000000000000000000000..be8f7158ed857f66f5ddbdc5549aa64e364c4b45 --- /dev/null +++ b/src/components/Connection/deleteGRDFAccountModal.scss @@ -0,0 +1,26 @@ +@import '../../styles/base/color'; + +.delete-grdf-modal { + .icon-main { + display: flex; + svg { + margin: auto; + } + } + .text1 { + margin-top: 1rem; + } + .text2 { + color: $grey-bright; + margin: 1rem 0; + } + .text3 { + margin-bottom: 1rem; + } + .buttons { + display: flex; + button.btn-secondary-positive { + margin-right: 1rem; + } + } +} diff --git a/src/components/Connection/expiredConsentModal.scss b/src/components/Connection/expiredConsentModal.scss new file mode 100644 index 0000000000000000000000000000000000000000..1c67d8684f3e1987194936bc92ba0cc272df55e3 --- /dev/null +++ b/src/components/Connection/expiredConsentModal.scss @@ -0,0 +1,29 @@ +@import '../../styles/base/color'; + +.expired-consent-modal { + .icon-main { + display: flex; + svg { + margin: auto; + } + } + .title { + text-align: center; + &.electricity { + color: $elec-color; + } + &.gas { + color: $gas-color; + } + } + .text1 { + color: $grey-bright; + margin: 1rem 0; + } + .buttons { + display: flex; + button.btn-secondary-positive { + margin-right: 1rem; + } + } +} diff --git a/src/components/ConsumptionVisualizer/ConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/ConsumptionVisualizer.tsx index 4db81bc7574a56a31f8098bdaaa0ddf6498386ef..11d88685726a9b85c7e6aa98dad3b06a19564283 100644 --- a/src/components/ConsumptionVisualizer/ConsumptionVisualizer.tsx +++ b/src/components/ConsumptionVisualizer/ConsumptionVisualizer.tsx @@ -4,13 +4,10 @@ import { useSelector } from 'react-redux' import { AppStore } from 'store' import { FluidType } from 'enum/fluid.enum' import { DateTime } from 'luxon' - import { Dataload } from 'models' -import DateChartService from 'services/dateChart.service' import DataloadConsumptionVisualizer from 'components/ConsumptionVisualizer/DataloadConsumptionVisualizer' -import LastDataConsumptionVisualizer from 'components/ConsumptionVisualizer/LastDataConsumptionVisualizer' -import ErrorDataConsumptionVisualizer from 'components/ConsumptionVisualizer/ErrorDataConsumptionVisualizer' +import InfoDataConsumptionVisualizer from './InfoDataConsumptionVisualizer' interface ConsumptionVisualizerProps { fluidType: FluidType @@ -32,7 +29,6 @@ const ConsumptionVisualizer: React.FC<ConsumptionVisualizerProps> = ({ const compareDataload: Dataload | null = currentDatachart.comparisonData ? currentDatachart.comparisonData[currentDatachartIndex] : null - const dateChartService = new DateChartService() const getLastDataDate = (): DateTime | null => { let lastDay: DateTime | null = null @@ -55,6 +51,7 @@ const ConsumptionVisualizer: React.FC<ConsumptionVisualizerProps> = ({ return lastDay } const lastDataDate: DateTime | null = getLastDataDate() + return ( <div className="consumptionvisualizer-root"> <DataloadConsumptionVisualizer @@ -62,30 +59,14 @@ const ConsumptionVisualizer: React.FC<ConsumptionVisualizerProps> = ({ dataload={dataload} compareDataload={compareDataload} showCompare={showCompare} - lastDataDate={lastDataDate} setActive={setActive} /> <div className="consumptionvisualizer-info"> - {dataload && - dataload.valueDetail && - ((dataload.valueDetail[0] === -1 && - !dateChartService.isDataToCome(dataload, FluidType.ELECTRICITY)) || - (dataload.valueDetail[1] === -1 && - !dateChartService.isDataToCome(dataload, FluidType.WATER)) || - (dataload.valueDetail[2] === -1 && - !dateChartService.isDataToCome(dataload, FluidType.GAS))) && ( - <ErrorDataConsumptionVisualizer fluidType={fluidType} /> - )} - {!dataload || - (dataload && - dataload.value === -1 && - lastDataDate && - dataload.date > lastDataDate && ( - <LastDataConsumptionVisualizer - lastDataDate={lastDataDate} - fluidType={fluidType} - /> - ))} + <InfoDataConsumptionVisualizer + dataload={dataload} + fluidType={fluidType} + lastDataDate={lastDataDate} + /> </div> </div> ) diff --git a/src/components/ConsumptionVisualizer/DataloadComparisonLeft.spec.tsx b/src/components/ConsumptionVisualizer/DataloadComparisonLeft.spec.tsx deleted file mode 100644 index f8823fc779403c72bcfce5b07504cfc1bbbb38c9..0000000000000000000000000000000000000000 --- a/src/components/ConsumptionVisualizer/DataloadComparisonLeft.spec.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import React from 'react' -import { mount } from 'enzyme' -import { Provider } from 'react-redux' - -import configureStore from 'redux-mock-store' -import { mockInitialEcolyoState } from '../../../tests/__mocks__/store' -import { FluidType } from 'enum/fluid.enum' - -import { baseDataLoad } from '../../../tests/__mocks__/datachartData.mock' -import DataloadComparisonLeft from './DataloadComparisonLeft' - -jest.mock('cozy-ui/transpiled/react/I18n', () => { - return { - useI18n: jest.fn(() => { - return { - t: (str: string) => str, - } - }), - } -}) - -const mockStore = configureStore([]) -describe('DataloadComparisonLeft component', () => { - it('should render correctly', () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, - }) - const wrapper = mount( - <Provider store={store}> - <DataloadComparisonLeft - compareDataload={baseDataLoad} - fluidType={FluidType.ELECTRICITY} - /> - </Provider> - ) - expect(wrapper).toMatchSnapshot() - }) - it('should render empty comparison', () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, - }) - const updatedDataload = { ...baseDataLoad, value: -1 } - const wrapper = mount( - <Provider store={store}> - <DataloadComparisonLeft - compareDataload={updatedDataload} - fluidType={FluidType.ELECTRICITY} - /> - </Provider> - ) - expect(wrapper.find('.dataloadvisualizer-novalue')).toBeTruthy() - }) -}) diff --git a/src/components/ConsumptionVisualizer/DataloadComparisonLeft.tsx b/src/components/ConsumptionVisualizer/DataloadComparisonLeft.tsx deleted file mode 100644 index e0edf457ccbb20cb3bd629a694c7b67de9ddfc96..0000000000000000000000000000000000000000 --- a/src/components/ConsumptionVisualizer/DataloadComparisonLeft.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import React from 'react' -import './consumptionVisualizer.scss' -import { FluidType } from 'enum/fluid.enum' -import { Dataload } from 'models' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { formatNumberValues } from 'utils/utils' -import ConverterService from 'services/converter.service' - -interface DataloadComparisonLeftProps { - compareDataload: Dataload - fluidType: FluidType -} -const DataloadComparisonLeft: React.FC<DataloadComparisonLeftProps> = ({ - compareDataload, - fluidType, -}: DataloadComparisonLeftProps) => { - const { t } = useI18n() - const converterService = new ConverterService() - - return ( - <> - {compareDataload.value === -1 ? ( - <div className="dataloadvisualizer-section dataloadvisualizer-section-left-novalue"> - <div - className={`dataloadvisualizer-novalue ${FluidType[ - fluidType - ].toLowerCase()}-compare text-20-normal`} - > - {t('consumption_visualizer.missing_data')} - </div> - </div> - ) : ( - <div className="dataloadvisualizer-section dataloadvisualizer-section-left"> - <div - className={`dataloadvisualizer-value ${FluidType[ - fluidType - ].toLowerCase()}-compare text-36-bold`} - > - {formatNumberValues(compareDataload.value)} - <span className="text-18-normal">{`${t( - 'FLUID.' + FluidType[fluidType] + '.UNIT' - )}`}</span> - </div> - <> - {fluidType === FluidType.MULTIFLUID ? ( - <></> - ) : ( - <div - className={`dataloadvisualizer-euro ${FluidType[ - fluidType - ].toLowerCase()}-compare text-16-normal`} - > - {`${formatNumberValues( - converterService.LoadToEuro( - compareDataload.value, - fluidType, - compareDataload.price ? compareDataload.price : null - ) - )} €`} - </div> - )} - </> - </div> - )} - </> - ) -} - -export default DataloadComparisonLeft diff --git a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx index ddb94ea25ca318253fb7a30a206dfc9f7a6e5469..d8ff32d39c3499893d0e514f1a7188d12306ed1c 100644 --- a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx +++ b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx @@ -49,9 +49,6 @@ describe('Dataload consumption visualizer component', () => { dataload={baseDataLoad} showCompare={false} compareDataload={baseDataLoad} - lastDataDate={DateTime.fromISO('2021-09-23T00:00:00.000Z', { - zone: 'utc', - })} setActive={jest.fn()} /> </Provider> @@ -71,9 +68,6 @@ describe('Dataload consumption visualizer component', () => { dataload={baseDataLoad} showCompare={false} compareDataload={baseDataLoad} - lastDataDate={DateTime.fromISO('2021-09-23T00:00:00.000Z', { - zone: 'utc', - })} setActive={jest.fn()} /> </Provider> @@ -93,9 +87,6 @@ describe('Dataload consumption visualizer component', () => { dataload={baseDataLoad} showCompare={true} compareDataload={emptyDataLoad} - lastDataDate={DateTime.fromISO('2021-09-23T00:00:00.000Z', { - zone: 'utc', - })} setActive={jest.fn()} /> </Provider> @@ -115,9 +106,6 @@ describe('Dataload consumption visualizer component', () => { dataload={baseDataLoad} showCompare={true} compareDataload={baseDataLoad} - lastDataDate={DateTime.fromISO('2021-09-23T00:00:00.000Z', { - zone: 'utc', - })} setActive={jest.fn()} /> </Provider> @@ -138,9 +126,6 @@ describe('Dataload consumption visualizer component', () => { dataload={dataLoadWithValueDetailEmpty} showCompare={false} compareDataload={emptyDataLoad} - lastDataDate={DateTime.fromISO('2021-09-23T00:00:00.000Z', { - zone: 'utc', - })} setActive={jest.fn()} /> </Provider> @@ -175,9 +160,6 @@ describe('Dataload consumption visualizer component', () => { dataload={dataLoadWithValueDetail} showCompare={false} compareDataload={emptyDataLoad} - lastDataDate={DateTime.fromISO('2021-09-23T00:00:00.000Z', { - zone: 'utc', - })} setActive={jest.fn()} /> </Router> diff --git a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx index 15dfb718fd53632d67ae33426b5f8e30efeff5c3..ec1fa6b954c4a7890d24e5c5ba00c5bcd03df3e1 100644 --- a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx +++ b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx @@ -1,32 +1,19 @@ import React, { useCallback, useState } from 'react' import './dataloadConsumptionVisualizer.scss' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { useSelector } from 'react-redux' import { AppStore } from 'store' -import { NavLink } from 'react-router-dom' -import { DateTime } from 'luxon' -import { formatNumberValues } from 'utils/utils' - import { Dataload } from 'models' import { FluidType } from 'enum/fluid.enum' -import ConverterService from 'services/converter.service' -import DateChartService from 'services/dateChart.service' -import { getNavPicto } from 'utils/picto' - -import Icon from 'cozy-ui/transpiled/react/Icon' -import { useClient } from 'cozy-client' -import { UsageEventType } from 'enum/usageEvent.enum' -import UsageEventService from 'services/usageEvent.service' import EstimatedConsumptionModal from './EstimatedConsumptionModal' -import DataloadComparisonLeft from './DataloadComparisonLeft' import DataloadNoValue from './DataloadNoValue' +import { DataloadSectionType, DataloadState } from 'enum/dataload.enum' +import DataloadSection from './DataloadSection' interface DataloadConsumptionVisualizerProps { fluidType: FluidType dataload: Dataload compareDataload: Dataload | null showCompare: boolean - lastDataDate: DateTime | null setActive: React.Dispatch<React.SetStateAction<boolean>> } const DataloadConsumptionVisualizer = ({ @@ -34,209 +21,64 @@ const DataloadConsumptionVisualizer = ({ dataload, compareDataload, showCompare, - lastDataDate, setActive, }: DataloadConsumptionVisualizerProps) => { - const { t } = useI18n() - const { loading, currentDatachart } = useSelector( - (state: AppStore) => state.ecolyo.chart - ) - const client = useClient() + const { loading } = useSelector((state: AppStore) => state.ecolyo.chart) const [openEstimationModal, setOpenEstimationModal] = useState<boolean>(false) - const converterService = new ConverterService() - const dateChartService = new DateChartService() - const emitNavEvent = useCallback( - async (targetPage: string) => { - await UsageEventService.addEvent(client, { - type: UsageEventType.NAVIGATION_EVENT, - target: targetPage, - }) - }, - [client] - ) const toggleEstimationModal = useCallback(() => { setOpenEstimationModal(prev => !prev) }, []) - return ( - <div className="dataloadvisualizer-root"> - {!loading && dataload && dataload.value > -1 ? ( - <div className="dataloadvisualizer-content"> - {showCompare && compareDataload && ( - <DataloadComparisonLeft - fluidType={fluidType} - compareDataload={compareDataload} - /> - )} - <div - className={ - showCompare - ? 'dataloadvisualizer-section dataloadvisualizer-section-right' - : 'dataloadvisualizer-section' - } - > - <div - className={`dataloadvisualizer-value ${FluidType[ - fluidType - ].toLowerCase()} text-36-bold ${ - fluidType === FluidType.MULTIFLUID && showCompare - ? 'multifluid-compare-color' - : '' - }`} - > - {formatNumberValues(dataload.value, FluidType[fluidType], true) >= - 1000 && fluidType !== FluidType.MULTIFLUID ? ( - <> - {formatNumberValues(dataload.value, FluidType[fluidType])} - <span className="text-18-normal"> - {`${t('FLUID.' + FluidType[fluidType] + '.MEGAUNIT')}`} - </span> - </> - ) : ( - <> - {formatNumberValues(dataload.value)} - <span - className={`text-18-normal ${ - fluidType === FluidType.MULTIFLUID && !showCompare - ? 'euroUnit' - : '' - }`} - > - {`${t('FLUID.' + FluidType[fluidType] + '.UNIT')}`} - </span> - {fluidType === FluidType.MULTIFLUID && !showCompare && ( - <span - className="text-14-normal estimated" - onClick={toggleEstimationModal} - > - {t('consumption_visualizer.estimated')} - </span> - )} - </> - )} - </div> - {fluidType !== FluidType.MULTIFLUID ? ( - <div - className={`dataloadvisualizer-euro ${FluidType[ - fluidType - ].toLowerCase()} text-16-normal`} - > - {`${formatNumberValues( - converterService.LoadToEuro( - dataload.value, - fluidType, - dataload.price ? dataload.price : null - ) - )} €`} - </div> - ) : ( - <> - {showCompare ? ( - <></> - ) : ( - <div className="dataloadvisualizer-euro text-16-normal"> - {dataload.valueDetail ? ( - dataload.valueDetail.map((load, index) => { - return ( - <NavLink - key={index} - to={`/consumption/${FluidType[ - index - ].toLowerCase()}`} - className="dataloadvisualizer-euro-link" - > - <div - className={ - load !== -1 - ? `dataloadvisualizer-euro-fluid ${FluidType[ - index - ].toLowerCase()}` - : !dateChartService.isDataToCome( - dataload, - index - ) - ? dateChartService.isDataHole( - currentDatachart, - index - ) - ? `dataloadvisualizer-euro-fluid ${FluidType[ - index - ].toLowerCase()}` - : 'dataloadvisualizer-euro-fluid error' - : `dataloadvisualizer-euro-fluid ${FluidType[ - index - ].toLowerCase()}` - } - onClick={() => - emitNavEvent(FluidType[index].toLowerCase()) - } - > - <Icon - className="dataloadvisualizer-euro-fluid-icon" - icon={getNavPicto(index, true, true)} - size={22} - /> - <div> - {load !== -1 - ? `${formatNumberValues(load)} €` - : !dateChartService.isDataToCome( - dataload, - index - ) - ? dateChartService.isDataHole( - currentDatachart, - index - ) - ? 'Vide' - : t('consumption_visualizer.aie') - : t('consumption_visualizer.data_to_come')} - </div> - </div> - </NavLink> - ) - }) - ) : ( - <NavLink - to={`/consumption/${FluidType[ - fluidType - ].toLowerCase()}`} - className="dataloadvisualizer-euro-link" - > - <div - className={`dataloadvisualizer-euro-fluid ${FluidType[ - fluidType - ].toLowerCase()}`} - > - <Icon - className="dataloadvisualizer-euro-fluid-icon" - icon={getNavPicto(fluidType, true, true)} - size={22} - /> - <div>{`${formatNumberValues( - converterService.LoadToEuro( - dataload.value, - fluidType, - dataload.price ? dataload.price : null - ) - )} €`}</div> - </div> - </NavLink> - )} - </div> - )} - </> - )} - </div> - </div> - ) : ( + if (loading || !dataload) { + return <div className="dataloadvisualizer-root"></div> + } + + if ( + dataload.state !== DataloadState.VALID && + dataload.state !== DataloadState.AGGREGATED_VALID && + dataload.state !== DataloadState.AGGREGATED_WITH_EMPTY && + dataload.state !== DataloadState.AGGREGATED_WITH_HOLE_OR_MISSING && + dataload.state !== DataloadState.AGGREGATED_WITH_COMING + ) { + return ( + <div className="dataloadvisualizer-root"> <DataloadNoValue - lastDataDate={lastDataDate} dataload={dataload} setActive={setActive} fluidType={fluidType} /> - )} + </div> + ) + } + + return ( + <div className="dataloadvisualizer-root"> + <div className="dataloadvisualizer-content"> + {showCompare && compareDataload ? ( + <> + <DataloadSection + dataload={compareDataload} + fluidType={fluidType} + dataloadSectionType={DataloadSectionType.LEFT} + toggleEstimationModal={toggleEstimationModal} + /> + <DataloadSection + dataload={dataload} + fluidType={fluidType} + dataloadSectionType={DataloadSectionType.RIGHT} + toggleEstimationModal={toggleEstimationModal} + /> + </> + ) : ( + <DataloadSection + dataload={dataload} + fluidType={fluidType} + dataloadSectionType={DataloadSectionType.NO_COMPARE} + toggleEstimationModal={toggleEstimationModal} + /> + )} + </div> <EstimatedConsumptionModal open={openEstimationModal} handleCloseClick={toggleEstimationModal} diff --git a/src/components/ConsumptionVisualizer/DataloadNoValue.spec.tsx b/src/components/ConsumptionVisualizer/DataloadNoValue.spec.tsx index 3a2cf00dafef1534959dc6f6959c8046e59a5d29..f1e680ae2c54ba432b88a476a368a561f1a877f1 100644 --- a/src/components/ConsumptionVisualizer/DataloadNoValue.spec.tsx +++ b/src/components/ConsumptionVisualizer/DataloadNoValue.spec.tsx @@ -1,17 +1,11 @@ import React from 'react' import { mount } from 'enzyme' -import { Provider } from 'react-redux' -import * as reactRedux from 'react-redux' -import configureStore from 'redux-mock-store' -import { mockInitialEcolyoState } from '../../../tests/__mocks__/store' +import toJson from 'enzyme-to-json' import { FluidType } from 'enum/fluid.enum' import DataloadNoValue from './DataloadNoValue' -import { - baseDataLoad, - graphData, -} from '../../../tests/__mocks__/datachartData.mock' -import { DateTime } from 'luxon' -import { Datachart } from 'models' +import { baseDataLoad } from '../../../tests/__mocks__/datachartData.mock' +import { DataloadState } from 'enum/dataload.enum' +import { Dataload } from 'models' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -22,84 +16,109 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) +const mockSetActive = jest.fn() -const mockStore = configureStore([]) describe('DataloadNoValue component', () => { + const mockDataload: Dataload = baseDataLoad + it('should render correctly', () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, - }) - const mockSetActive = jest.fn() const wrapper = mount( - <Provider store={store}> + <DataloadNoValue + dataload={mockDataload} + fluidType={FluidType.ELECTRICITY} + setActive={mockSetActive} + /> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + + describe('should render correctly no data', () => { + it('case state EMPTY', () => { + const _mockdataLoad = { ...mockDataload, state: DataloadState.EMPTY } + const wrapper = mount( <DataloadNoValue - dataload={baseDataLoad} + dataload={_mockdataLoad} fluidType={FluidType.ELECTRICITY} - lastDataDate={null} setActive={mockSetActive} /> - </Provider> - ) - expect(wrapper).toMatchSnapshot() - }) - it('should render with missing data state and click on the error button', () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, + ) + expect(wrapper.find('.dataloadvisualizer-value').text()).toBe( + 'consumption_visualizer.no_data' + ) }) - const mockSetActive = jest.fn() - const wrapper = mount( - <Provider store={store}> + it('case state HOLE', () => { + const _mockdataLoad = { ...mockDataload, state: DataloadState.HOLE } + const wrapper = mount( <DataloadNoValue - dataload={baseDataLoad} + dataload={_mockdataLoad} fluidType={FluidType.ELECTRICITY} - lastDataDate={null} setActive={mockSetActive} /> - </Provider> - ) - expect(wrapper.find('.error').simulate('click')) - }) - - it('should render with data-to-come state', () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, + ) + expect(wrapper.find('.dataloadvisualizer-value').text()).toBe( + 'consumption_visualizer.no_data' + ) }) - const updatedDataLoad = { ...baseDataLoad, date: DateTime.local() } - const mockSetActive = jest.fn() - const wrapper = mount( - <Provider store={store}> + it('case state AGGREGATED_EMPTY', () => { + const _mockdataLoad = { + ...mockDataload, + state: DataloadState.AGGREGATED_EMPTY, + } + const wrapper = mount( <DataloadNoValue - dataload={updatedDataLoad} - fluidType={FluidType.ELECTRICITY} - lastDataDate={null} + dataload={_mockdataLoad} + fluidType={FluidType.MULTIFLUID} setActive={mockSetActive} /> - </Provider> - ) - expect(wrapper.find('.to-come')).toBeTruthy() - }) - it('should render with data-hole state', () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, + ) + expect(wrapper.find('.dataloadvisualizer-value').text()).toBe( + 'consumption_visualizer.no_data' + ) }) - const mockSetActive = jest.fn() - const mockUseSelector = jest.spyOn(reactRedux, 'useSelector') - const updatedData: Datachart = { ...graphData } - //Data hole insertion - updatedData.actualData[0].value = -1 - updatedData.actualData[1].value = 90 + }) - mockUseSelector.mockReturnValue({ currentDatachart: graphData }) - const wrapper = mount( - <Provider store={store}> + describe('should render correctly missing data', () => { + it('case state MISSING', () => { + const _mockdataLoad = { ...mockDataload, state: DataloadState.MISSING } + const wrapper = mount( <DataloadNoValue - dataload={baseDataLoad} + dataload={_mockdataLoad} fluidType={FluidType.ELECTRICITY} - lastDataDate={DateTime.local()} setActive={mockSetActive} /> - </Provider> + ) + expect(wrapper.find('.dataloadvisualizer-content').text()).toBe( + 'consumption_visualizer.missing_data' + ) + }) + it('case state AGGREGATED_HOLE_OR_MISSING', () => { + const _mockdataLoad = { + ...mockDataload, + state: DataloadState.AGGREGATED_HOLE_OR_MISSING, + } + const wrapper = mount( + <DataloadNoValue + dataload={_mockdataLoad} + fluidType={FluidType.MULTIFLUID} + setActive={mockSetActive} + /> + ) + expect(wrapper.find('.dataloadvisualizer-content').text()).toBe( + 'consumption_visualizer.missing_data' + ) + }) + }) + + it('should call setActive when missing message is clicked', () => { + const _mockdataLoad = { ...mockDataload, state: DataloadState.MISSING } + const wrapper = mount( + <DataloadNoValue + dataload={_mockdataLoad} + fluidType={FluidType.ELECTRICITY} + setActive={mockSetActive} + /> ) - expect(wrapper.find('.no-data-text').simulate('click')) + wrapper.find('.dataloadvisualizer-content').simulate('click') + expect(mockSetActive).toBeCalledWith(true) }) }) diff --git a/src/components/ConsumptionVisualizer/DataloadNoValue.tsx b/src/components/ConsumptionVisualizer/DataloadNoValue.tsx index 667bc7de690abaf63823028e5569926f88af89c5..e00a7d364f4fad6492e0791110b50331c5b285aa 100644 --- a/src/components/ConsumptionVisualizer/DataloadNoValue.tsx +++ b/src/components/ConsumptionVisualizer/DataloadNoValue.tsx @@ -1,44 +1,24 @@ -import React, { useCallback, useState } from 'react' +import React, { useCallback } from 'react' import './consumptionVisualizer.scss' import { FluidType } from 'enum/fluid.enum' import { Dataload } from 'models' import { useI18n } from 'cozy-ui/transpiled/react/I18n' - -import { DateTime } from 'luxon' -import { useSelector } from 'react-redux' -import { AppStore } from 'store' -import ConfigService from 'services/fluidConfig.service' -import NoDataModal from './NoDataModal' -import DateChartService from 'services/dateChart.service' +import { DataloadState } from 'enum/dataload.enum' +import classNames from 'classnames' interface DataloadNoValueProps { dataload: Dataload fluidType: FluidType - lastDataDate: DateTime | null setActive: React.Dispatch<React.SetStateAction<boolean>> } -enum NoDataState { - DATA_TO_COME = 0, - DATA_HOLE = 1, - MISSING_DATA = 2, -} const DataloadNoValue: React.FC<DataloadNoValueProps> = ({ dataload, fluidType, setActive, - lastDataDate, }: DataloadNoValueProps) => { const { t } = useI18n() - const { currentDatachart } = useSelector( - (state: AppStore) => state.ecolyo.chart - ) - const configService = new ConfigService() - const fluidConfig = configService.getFluidConfig() - const [openNodataModal, setopenNodataModal] = useState<boolean>(false) - const toggleNoDataModal = useCallback(() => { - setopenNodataModal(prev => !prev) - }, []) + const handleToggleKonnectionCard = useCallback(() => { setActive(true) const app = document.querySelector('.app-content') @@ -60,77 +40,54 @@ const DataloadNoValue: React.FC<DataloadNoValueProps> = ({ } }, [setActive]) - const getDataState = useCallback(() => { - if (fluidType !== FluidType.MULTIFLUID) { - //J+3 for elec and J+5 for the other - const delay = fluidConfig[fluidType].dataDelayOffset + 1 - const today = DateTime.local().setZone('utc', { - keepLocalTime: true, - }) - const offsetDate = today.minus({ days: delay }) - if (dataload && offsetDate < dataload.date) { - return NoDataState.DATA_TO_COME - } else if (dataload && dataload.date < offsetDate) { - const dateChartService = new DateChartService() - if ( - dateChartService.isDataHole(currentDatachart) && - lastDataDate && - lastDataDate > dataload.date - ) { - return NoDataState.DATA_HOLE - } else return NoDataState.MISSING_DATA - } else return NoDataState.MISSING_DATA - } - return NoDataState.DATA_TO_COME - }, [currentDatachart, dataload, fluidConfig, fluidType, lastDataDate]) - - return ( - <> - {getDataState() === NoDataState.DATA_TO_COME && ( - <div className={`dataloadvisualizer-content text-22-normal`}> - <div className="dataloadvisualizer-section"> - <div - className={`dataloadvisualizer-value ${FluidType[ - fluidType - ].toLowerCase()} upper to-come`} - > - {t('consumption_visualizer.data_to_come')} - </div> + if ( + dataload.state === DataloadState.EMPTY || + dataload.state === DataloadState.HOLE || + dataload.state === DataloadState.AGGREGATED_EMPTY + ) { + return ( + <div className={`dataloadvisualizer-content text-22-normal`}> + <div className="dataloadvisualizer-section"> + <div + className={`dataloadvisualizer-value ${FluidType[ + fluidType + ].toLowerCase()} upper`} + > + {t('consumption_visualizer.no_data')} </div> </div> - )} - {getDataState() === NoDataState.MISSING_DATA && ( + </div> + ) + } + + if ( + dataload.state === DataloadState.MISSING || + dataload.state === DataloadState.AGGREGATED_HOLE_OR_MISSING + ) { + return ( + <div + onClick={handleToggleKonnectionCard} + className={classNames('dataloadvisualizer-content text-22-normal', { + ['error']: fluidType !== FluidType.MULTIFLUID, + })} + > + {t('consumption_visualizer.missing_data')} + </div> + ) + } + + return ( + <div className={`dataloadvisualizer-content text-22-normal`}> + <div className="dataloadvisualizer-section"> <div - onClick={handleToggleKonnectionCard} - className={`dataloadvisualizer-content error text-22-normal`} + className={`dataloadvisualizer-value ${FluidType[ + fluidType + ].toLowerCase()} upper to-come`} > - {t('consumption_visualizer.missing_data')} - </div> - )} - {getDataState() === NoDataState.DATA_HOLE && ( - <div className={`dataloadvisualizer-content text-22-normal`}> - <div className="dataloadvisualizer-section"> - <div - className={`dataloadvisualizer-value ${FluidType[ - fluidType - ].toLowerCase()} upper`} - > - {t('consumption_visualizer.no_data')} - </div> - <div - className="text-15-normal no-data-text" - onClick={toggleNoDataModal} - > - {t('consumption_visualizer.why_no_data')} - </div> - </div> + {t('consumption_visualizer.data_to_come')} </div> - )} - <NoDataModal - open={openNodataModal} - handleCloseClick={toggleNoDataModal} - /> - </> + </div> + </div> ) } diff --git a/src/components/ConsumptionVisualizer/DataloadSection.spec.tsx b/src/components/ConsumptionVisualizer/DataloadSection.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..348a7d9d6077effa0a4190e39b31f06bf02799cf --- /dev/null +++ b/src/components/ConsumptionVisualizer/DataloadSection.spec.tsx @@ -0,0 +1,60 @@ +import React from 'react' +import { mount } from 'enzyme' +import toJson from 'enzyme-to-json' +import { FluidType } from 'enum/fluid.enum' +import { baseDataLoad } from '../../../tests/__mocks__/datachartData.mock' +import { DataloadSectionType } from 'enum/dataload.enum' +import { Dataload } from 'models' +import DataloadSection from './DataloadSection' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) + +jest.mock( + 'components/ConsumptionVisualizer/DataloadSectionValue', + () => 'mock-dataloadsectionvalue' +) +jest.mock( + 'components/ConsumptionVisualizer/DataloadSectionDetail', + () => 'mock-dataloadsectiondetail' +) + +const mockToggleEstimationModal = jest.fn() + +describe('DataloadSection component', () => { + const mockDataload: Dataload = baseDataLoad + + it('should render correctly', () => { + const wrapper = mount( + <DataloadSection + dataload={mockDataload} + fluidType={FluidType.ELECTRICITY} + dataloadSectionType={DataloadSectionType.NO_COMPARE} + toggleEstimationModal={mockToggleEstimationModal} + /> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + + it('should render no_data when dataload value is -1 and section is left', () => { + const _mockDatalaod = { ...mockDataload, value: -1 } + const wrapper = mount( + <DataloadSection + dataload={_mockDatalaod} + fluidType={FluidType.ELECTRICITY} + dataloadSectionType={DataloadSectionType.LEFT} + toggleEstimationModal={mockToggleEstimationModal} + /> + ) + expect(wrapper.find('.dataloadvisualizer-novalue').text()).toBe( + 'consumption_visualizer.no_data' + ) + }) +}) diff --git a/src/components/ConsumptionVisualizer/DataloadSection.tsx b/src/components/ConsumptionVisualizer/DataloadSection.tsx new file mode 100644 index 0000000000000000000000000000000000000000..14482e3c5bc62bc4738652ca9e5f385ea25f60dd --- /dev/null +++ b/src/components/ConsumptionVisualizer/DataloadSection.tsx @@ -0,0 +1,80 @@ +import React from 'react' +import './consumptionVisualizer.scss' +import { FluidType } from 'enum/fluid.enum' +import { Dataload } from 'models' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { DataloadSectionType } from 'enum/dataload.enum' +import classNames from 'classnames' + +import DataloadSectionValue from './DataloadSectionValue' +import DataloadSectionDetail from './DataloadSectionDetail' + +interface DataloadSectionProps { + dataload: Dataload + fluidType: FluidType + dataloadSectionType: DataloadSectionType + toggleEstimationModal: () => void +} +const DataloadSection: React.FC<DataloadSectionProps> = ({ + dataload, + fluidType, + dataloadSectionType, + toggleEstimationModal, +}: DataloadSectionProps) => { + const { t } = useI18n() + + if ( + dataload.value === -1 && + dataloadSectionType === DataloadSectionType.LEFT + ) { + return ( + <div className="dataloadvisualizer-section dataloadvisualizer-section-left-novalue"> + <div + className={`dataloadvisualizer-novalue ${FluidType[ + fluidType + ].toLowerCase()}-compare text-20-normal`} + > + {t('consumption_visualizer.no_data')} + </div> + </div> + ) + } + + return ( + <div + className={classNames('dataloadvisualizer-section', { + ['dataloadvisualizer-section-left']: + dataloadSectionType === DataloadSectionType.LEFT, + ['dataloadvisualizer-section-right']: + dataloadSectionType === DataloadSectionType.RIGHT, + })} + > + <div + className={classNames('dataloadvisualizer-value', 'text-36-bold', { + [`${FluidType[fluidType].toLowerCase()}-compare`]: + dataloadSectionType === DataloadSectionType.LEFT, + [`${FluidType[fluidType].toLowerCase()}`]: + dataloadSectionType === DataloadSectionType.NO_COMPARE || + dataloadSectionType === DataloadSectionType.RIGHT, + ['multifluid-compare-color']: + dataloadSectionType === DataloadSectionType.RIGHT && + fluidType === FluidType.MULTIFLUID, + })} + > + <DataloadSectionValue + dataload={dataload} + fluidType={fluidType} + dataloadSectionType={dataloadSectionType} + toggleEstimationModal={toggleEstimationModal} + /> + </div> + <DataloadSectionDetail + dataload={dataload} + fluidType={fluidType} + dataloadSectionType={dataloadSectionType} + /> + </div> + ) +} + +export default DataloadSection diff --git a/src/components/ConsumptionVisualizer/DataloadSectionDetail.spec.tsx b/src/components/ConsumptionVisualizer/DataloadSectionDetail.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..6a515cd71baeab0f7dc8f0182a21e42013d8010f --- /dev/null +++ b/src/components/ConsumptionVisualizer/DataloadSectionDetail.spec.tsx @@ -0,0 +1,137 @@ +import React from 'react' +import { mount } from 'enzyme' +import toJson from 'enzyme-to-json' +import { FluidType } from 'enum/fluid.enum' +import { baseDataLoad } from '../../../tests/__mocks__/datachartData.mock' +import { DataloadSectionType, DataloadState } from 'enum/dataload.enum' +import { Dataload } from 'models' +import DataloadSectionDetail from './DataloadSectionDetail' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) + +describe('DataloadSectionDetail component', () => { + const mockDataload: Dataload = baseDataLoad + + it('should render correctly', () => { + const wrapper = mount( + <DataloadSectionDetail + dataload={mockDataload} + fluidType={FluidType.ELECTRICITY} + dataloadSectionType={DataloadSectionType.NO_COMPARE} + /> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('should not display if multifluid and comparison', () => { + const wrapper = mount( + <DataloadSectionDetail + dataload={mockDataload} + fluidType={FluidType.MULTIFLUID} + dataloadSectionType={DataloadSectionType.RIGHT} + /> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('should not display value details if multifluid, no valueDetail and comparison', () => { + const mockMultiDataload: Dataload = { + ...mockDataload, + state: DataloadState.AGGREGATED_EMPTY, + valueDetail: null, + } + const wrapper = mount( + <DataloadSectionDetail + dataload={mockMultiDataload} + fluidType={FluidType.MULTIFLUID} + dataloadSectionType={DataloadSectionType.RIGHT} + /> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + + describe('should display value details if multifluid and no comparison', () => { + it('case all valid data', () => { + const mockMultiDataload: Dataload = { + ...mockDataload, + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 1, state: DataloadState.VALID }, + { value: 2, state: DataloadState.VALID }, + { value: 3, state: DataloadState.VALID }, + ], + } + const wrapper = mount( + <DataloadSectionDetail + dataload={mockMultiDataload} + fluidType={FluidType.MULTIFLUID} + dataloadSectionType={DataloadSectionType.RIGHT} + /> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('case valid and coming data', () => { + const mockMultiDataload: Dataload = { + ...mockDataload, + state: DataloadState.AGGREGATED_WITH_COMING, + valueDetail: [ + { value: 1, state: DataloadState.VALID }, + { value: -1, state: DataloadState.COMING }, + { value: 3, state: DataloadState.VALID }, + ], + } + const wrapper = mount( + <DataloadSectionDetail + dataload={mockMultiDataload} + fluidType={FluidType.MULTIFLUID} + dataloadSectionType={DataloadSectionType.RIGHT} + /> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('case valid and missing data', () => { + const mockMultiDataload: Dataload = { + ...mockDataload, + state: DataloadState.AGGREGATED_WITH_HOLE_OR_MISSING, + valueDetail: [ + { value: 1, state: DataloadState.VALID }, + { value: -1, state: DataloadState.MISSING }, + { value: 3, state: DataloadState.VALID }, + ], + } + const wrapper = mount( + <DataloadSectionDetail + dataload={mockMultiDataload} + fluidType={FluidType.MULTIFLUID} + dataloadSectionType={DataloadSectionType.RIGHT} + /> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + it('case valid and hole data', () => { + const mockMultiDataload: Dataload = { + ...mockDataload, + state: DataloadState.AGGREGATED_WITH_HOLE_OR_MISSING, + valueDetail: [ + { value: 1, state: DataloadState.VALID }, + { value: -1, state: DataloadState.HOLE }, + { value: 3, state: DataloadState.VALID }, + ], + } + const wrapper = mount( + <DataloadSectionDetail + dataload={mockMultiDataload} + fluidType={FluidType.MULTIFLUID} + dataloadSectionType={DataloadSectionType.RIGHT} + /> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + }) +}) diff --git a/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx b/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx new file mode 100644 index 0000000000000000000000000000000000000000..29e629a1b0a49e831c28d3ee2f72da2fba473400 --- /dev/null +++ b/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx @@ -0,0 +1,148 @@ +import React, { useCallback } from 'react' +import classNames from 'classnames' +import { NavLink } from 'react-router-dom' +import { useClient } from 'cozy-client' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import Icon from 'cozy-ui/transpiled/react/Icon' +import { getNavPicto } from 'utils/picto' +import { Dataload } from 'models' +import { FluidType } from 'enum/fluid.enum' +import { DataloadSectionType, DataloadState } from 'enum/dataload.enum' +import { UsageEventType } from 'enum/usageEvent.enum' +import ConverterService from 'services/converter.service' +import { formatNumberValues } from 'utils/utils' +import UsageEventService from 'services/usageEvent.service' + +interface DataloadSectionDetailProps { + dataload: Dataload + fluidType: FluidType + dataloadSectionType: DataloadSectionType +} + +const DataloadSectionDetail = ({ + dataload, + fluidType, + dataloadSectionType, +}: DataloadSectionDetailProps) => { + const client = useClient() + const { t } = useI18n() + const converterService = new ConverterService() + + const emitNavEvent = useCallback( + async (targetPage: string) => { + await UsageEventService.addEvent(client, { + type: UsageEventType.NAVIGATION_EVENT, + target: targetPage, + }) + }, + [client] + ) + + if (fluidType !== FluidType.MULTIFLUID) { + return ( + <div + className={classNames('dataloadvisualizer-euro text-16-normal', { + [`${FluidType[fluidType].toLowerCase()}`]: + dataloadSectionType !== DataloadSectionType.LEFT, + [`${FluidType[fluidType].toLowerCase()}-compare`]: + dataloadSectionType === DataloadSectionType.LEFT, + })} + > + {`${formatNumberValues( + converterService.LoadToEuro( + dataload.value, + fluidType, + dataload.price ? dataload.price : null + ) + )} €`} + </div> + ) + } + + if ( + fluidType === FluidType.MULTIFLUID && + dataloadSectionType !== DataloadSectionType.NO_COMPARE + ) { + return <div className="dataloadvisualizer-euro text-16-normal"></div> + } + + if ( + fluidType === FluidType.MULTIFLUID && + dataloadSectionType === DataloadSectionType.NO_COMPARE && + dataload.valueDetail + ) { + return ( + <div className="dataloadvisualizer-euro text-16-normal"> + {dataload.valueDetail.map((valueDetail, index) => { + return ( + <NavLink + key={index} + to={`/consumption/${FluidType[index].toLowerCase()}`} + className="dataloadvisualizer-euro-link" + > + <div + className={classNames('dataloadvisualizer-euro-fluid', { + [` ${FluidType[index].toLowerCase()}`]: + valueDetail.state === DataloadState.VALID || + valueDetail.state === DataloadState.UPCOMING || + valueDetail.state === DataloadState.COMING || + valueDetail.state === DataloadState.EMPTY || + valueDetail.state === DataloadState.HOLE, + [` error`]: valueDetail.state === DataloadState.MISSING, + })} + onClick={() => emitNavEvent(FluidType[index].toLowerCase())} + > + <Icon + className="dataloadvisualizer-euro-fluid-icon" + icon={getNavPicto(index, true, true)} + size={22} + /> + <div> + {valueDetail.state === DataloadState.VALID && + `${formatNumberValues(valueDetail.value)} €`} + {(valueDetail.state === DataloadState.UPCOMING || + valueDetail.state === DataloadState.COMING) && + t('consumption_visualizer.data_to_come')} + {(valueDetail.state === DataloadState.EMPTY || + valueDetail.state === DataloadState.HOLE) && + t('consumption_visualizer.data_empty')} + {valueDetail.state === DataloadState.MISSING && + t('consumption_visualizer.aie')} + </div> + </div> + </NavLink> + ) + })} + </div> + ) + } + return ( + <div className="dataloadvisualizer-euro text-16-normal"> + <NavLink + to={`/consumption/${FluidType[fluidType].toLowerCase()}`} + className="dataloadvisualizer-euro-link" + > + <div + className={`dataloadvisualizer-euro-fluid ${FluidType[ + fluidType + ].toLowerCase()}`} + > + <Icon + className="dataloadvisualizer-euro-fluid-icon" + icon={getNavPicto(fluidType, true, true)} + size={22} + /> + <div>{`${formatNumberValues( + converterService.LoadToEuro( + dataload.value, + fluidType, + dataload.price ? dataload.price : null + ) + )} €`}</div> + </div> + </NavLink> + </div> + ) +} + +export default DataloadSectionDetail diff --git a/src/components/ConsumptionVisualizer/DataloadSectionValue.spec.tsx b/src/components/ConsumptionVisualizer/DataloadSectionValue.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0297049b01392e1e2713f8f5d6f504349070b92e --- /dev/null +++ b/src/components/ConsumptionVisualizer/DataloadSectionValue.spec.tsx @@ -0,0 +1,134 @@ +import React from 'react' +import { mount } from 'enzyme' +import toJson from 'enzyme-to-json' +import { FluidType } from 'enum/fluid.enum' +import { + baseDataLoad, + baseMultiFluidDataLoad, +} from '../../../tests/__mocks__/datachartData.mock' +import { DataloadSectionType } from 'enum/dataload.enum' +import { Dataload } from 'models' +import DataloadSectionValue from './DataloadSectionValue' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) + +const mockToggleEstimationModal = jest.fn() + +describe('DataloadSectionValue component', () => { + const mockDataload: Dataload = baseDataLoad + const mockMultiDataload: Dataload = baseMultiFluidDataLoad + it('should render correctly', () => { + const wrapper = mount( + <DataloadSectionValue + dataload={mockDataload} + fluidType={FluidType.ELECTRICITY} + dataloadSectionType={DataloadSectionType.NO_COMPARE} + toggleEstimationModal={mockToggleEstimationModal} + /> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + + describe('case Singlefluid', () => { + it('should render with unit when value < 1000', () => { + const wrapper = mount( + <DataloadSectionValue + dataload={mockDataload} + fluidType={FluidType.ELECTRICITY} + dataloadSectionType={DataloadSectionType.NO_COMPARE} + toggleEstimationModal={mockToggleEstimationModal} + /> + ) + expect( + wrapper + .find(DataloadSectionValue) + .first() + .contains('12,00') + ).toBeTruthy() + expect(wrapper.find('.text-18-normal').text()).toBe( + 'FLUID.ELECTRICITY.UNIT' + ) + }) + it('should render with mega unit when value >= 1000', () => { + const _mockDatalaod: Dataload = { ...mockDataload, value: 1000 } + const wrapper = mount( + <DataloadSectionValue + dataload={_mockDatalaod} + fluidType={FluidType.ELECTRICITY} + dataloadSectionType={DataloadSectionType.NO_COMPARE} + toggleEstimationModal={mockToggleEstimationModal} + /> + ) + expect( + wrapper + .find(DataloadSectionValue) + .first() + .contains('1,00') + ).toBeTruthy() + expect(wrapper.find('.text-18-normal').text()).toBe( + 'FLUID.ELECTRICITY.MEGAUNIT' + ) + }) + }) + + describe('case Multifluid', () => { + it('should render correctly when comparison', () => { + const wrapper = mount( + <DataloadSectionValue + dataload={mockMultiDataload} + fluidType={FluidType.MULTIFLUID} + dataloadSectionType={DataloadSectionType.RIGHT} + toggleEstimationModal={mockToggleEstimationModal} + /> + ) + expect( + wrapper + .find(DataloadSectionValue) + .first() + .contains('12,00') + ).toBeTruthy() + expect(wrapper.find('.euroUnit').exists()).toBeTruthy() + }) + it('should render correctly with a estimated link when no comparison', () => { + const wrapper = mount( + <DataloadSectionValue + dataload={mockMultiDataload} + fluidType={FluidType.MULTIFLUID} + dataloadSectionType={DataloadSectionType.NO_COMPARE} + toggleEstimationModal={mockToggleEstimationModal} + /> + ) + expect( + wrapper + .find(DataloadSectionValue) + .first() + .contains('12,00') + ).toBeTruthy() + expect(wrapper.find('.euroUnit').exists()).toBeTruthy() + expect(wrapper.find('.estimated').exists()).toBeTruthy() + expect(wrapper.find('.estimated').text()).toBe( + 'consumption_visualizer.estimated' + ) + }) + it('should call toggleEstimationModal when click on the estimated link', () => { + const wrapper = mount( + <DataloadSectionValue + dataload={mockMultiDataload} + fluidType={FluidType.MULTIFLUID} + dataloadSectionType={DataloadSectionType.NO_COMPARE} + toggleEstimationModal={mockToggleEstimationModal} + /> + ) + wrapper.find('.estimated').simulate('click') + expect(mockToggleEstimationModal).toBeCalled() + }) + }) +}) diff --git a/src/components/ConsumptionVisualizer/DataloadSectionValue.tsx b/src/components/ConsumptionVisualizer/DataloadSectionValue.tsx new file mode 100644 index 0000000000000000000000000000000000000000..14f2db2dfc45fee0017b739e9b100517b3c5e9ef --- /dev/null +++ b/src/components/ConsumptionVisualizer/DataloadSectionValue.tsx @@ -0,0 +1,64 @@ +import React from 'react' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { Dataload } from 'models' +import { FluidType } from 'enum/fluid.enum' +import { DataloadSectionType } from 'enum/dataload.enum' +import { formatNumberValues } from 'utils/utils' + +interface DataloadSectionValueProps { + dataload: Dataload + fluidType: FluidType + dataloadSectionType: DataloadSectionType + toggleEstimationModal: () => void +} + +const DataloadSectionValue = ({ + dataload, + fluidType, + dataloadSectionType, + toggleEstimationModal, +}: DataloadSectionValueProps) => { + const { t } = useI18n() + + if (fluidType === FluidType.MULTIFLUID) { + return ( + <> + {formatNumberValues(dataload.value)} + <span className={'text-18-normal euroUnit'}> + {`${t('FLUID.' + FluidType[fluidType] + '.UNIT')}`} + </span> + {dataloadSectionType === DataloadSectionType.NO_COMPARE && ( + <span + className="text-14-normal estimated" + onClick={toggleEstimationModal} + > + {t('consumption_visualizer.estimated')} + </span> + )} + </> + ) + } + + return ( + <> + {formatNumberValues(dataload.value, FluidType[fluidType], true) >= + 1000 ? ( + <> + {formatNumberValues(dataload.value, FluidType[fluidType])} + <span className="text-18-normal"> + {`${t('FLUID.' + FluidType[fluidType] + '.MEGAUNIT')}`} + </span> + </> + ) : ( + <> + {formatNumberValues(dataload.value)} + <span className={'text-18-normal'}> + {`${t('FLUID.' + FluidType[fluidType] + '.UNIT')}`} + </span> + </> + )} + </> + ) +} + +export default DataloadSectionValue diff --git a/src/components/ConsumptionVisualizer/ErrorDataConsumptionVisualizer.spec.tsx b/src/components/ConsumptionVisualizer/ErrorDataConsumptionVisualizer.spec.tsx deleted file mode 100644 index 2f56ebdb10d2eaf4308a240f3baa12bd840f57c6..0000000000000000000000000000000000000000 --- a/src/components/ConsumptionVisualizer/ErrorDataConsumptionVisualizer.spec.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import React from 'react' -import { mount } from 'enzyme' -import { Provider } from 'react-redux' -import * as reactRedux from 'react-redux' - -import configureStore from 'redux-mock-store' -import { mockInitialEcolyoState } from '../../../tests/__mocks__/store' -import ErrorDataConsumptionVisualizer from './ErrorDataConsumptionVisualizer' -import { FluidType } from 'enum/fluid.enum' -import { FluidStatus } from 'models' -import { fluidStatusData } from '../../../tests/__mocks__/fluidStatusData.mock' - -jest.mock('cozy-ui/transpiled/react/I18n', () => { - return { - useI18n: jest.fn(() => { - return { - t: (str: string) => str, - } - }), - } -}) - -const mockStore = configureStore([]) -describe('ErrorDataConsumptionVisualizer component', () => { - it('should render correctly', () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, - }) - const wrapper = mount( - <Provider store={store}> - <ErrorDataConsumptionVisualizer fluidType={FluidType.ELECTRICITY} /> - </Provider> - ) - expect(wrapper).toMatchSnapshot() - }) - it('should click and move to lastDataDate', async () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, - }) - const mockUseDispatch = jest.spyOn(reactRedux, 'useDispatch') - - const wrapper = mount( - <Provider store={store}> - <ErrorDataConsumptionVisualizer fluidType={FluidType.MULTIFLUID} /> - </Provider> - ) - wrapper.find('.error-line').simulate('click') - expect(mockUseDispatch).toHaveBeenCalled() - }) - it('should render with Electricity and no LastDataDate', async () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, - }) - const mockUseDispatch = jest.spyOn(reactRedux, 'useDispatch') - const mockUseSelector = jest.spyOn(reactRedux, 'useSelector') - const updatedFluidStatus: FluidStatus[] = { ...fluidStatusData } - updatedFluidStatus[0].lastDataDate = null - mockUseSelector.mockReturnValueOnce({ - fluidStatus: updatedFluidStatus, - fluidTypes: [FluidType.ELECTRICITY], - }) - const wrapper = mount( - <Provider store={store}> - <ErrorDataConsumptionVisualizer fluidType={FluidType.ELECTRICITY} /> - </Provider> - ) - wrapper.find('.error-line').simulate('click') - expect(mockUseDispatch).toHaveBeenCalled() - expect(wrapper.find('.underlined-error').text()).toBe( - 'consumption_visualizer.last_valid_data : -' - ) - }) -}) diff --git a/src/components/ConsumptionVisualizer/ErrorDataConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/ErrorDataConsumptionVisualizer.tsx deleted file mode 100644 index 2748eb165ffe2204deef54b0fcaefa9b9c590859..0000000000000000000000000000000000000000 --- a/src/components/ConsumptionVisualizer/ErrorDataConsumptionVisualizer.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import React from 'react' -import './errorDataConsumptionVisualizer.scss' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { useDispatch, useSelector } from 'react-redux' -import { AppStore } from 'store' -import { setCurrentIndex, setSelectedDate } from 'store/chart/chart.actions' -import { DateTime } from 'luxon' -import DateChartService from 'services/dateChart.service' -import { FluidType } from 'enum/fluid.enum' - -interface ErrorDataConsumptionVisualizerProps { - fluidType: FluidType -} -const ErrorDataConsumptionVisualizer: React.FC<ErrorDataConsumptionVisualizerProps> = ({ - fluidType, -}: ErrorDataConsumptionVisualizerProps) => { - const { t } = useI18n() - const dispatch = useDispatch() - const { selectedDate } = useSelector((state: AppStore) => state.ecolyo.chart) - const { currentTimeStep } = useSelector( - (state: AppStore) => state.ecolyo.chart - ) - const { fluidStatus, fluidTypes } = useSelector( - (state: AppStore) => state.ecolyo.global - ) - - const getLastDateWithAllData = (): DateTime | null => { - let lastDay: DateTime | null = null - const lastDays: DateTime[] = [] - if (fluidType === FluidType.MULTIFLUID) { - for (const _fluidType of fluidTypes) { - const date: DateTime | null = fluidStatus[_fluidType].lastDataDate - if (date) { - lastDays.push(date) - } - } - if (lastDays.length > 0) { - lastDay = lastDays.reduce(function(a, b) { - return a < b ? a : b - }) - } - } else { - lastDay = fluidStatus[fluidType].lastDataDate - } - return lastDay - } - const lastDateWithAllData: DateTime | null = getLastDateWithAllData() - - const setDateAndMoveToindex = () => { - if (lastDateWithAllData) { - const dateChartService = new DateChartService() - const updatedIndex: number = dateChartService.defineDateIndex( - currentTimeStep, - lastDateWithAllData - ) - dispatch(setSelectedDate(lastDateWithAllData)) - dispatch(setCurrentIndex(updatedIndex)) - } - } - - return ( - <> - {lastDateWithAllData && selectedDate < lastDateWithAllData ? ( - <></> - ) : ( - <div onClick={() => setDateAndMoveToindex()} className="error-line"> - <span className={`text-16-normal underlined-error`}> - {(fluidType && fluidType === FluidType.MULTIFLUID - ? `${t('consumption_visualizer.last_valid_data_multi')}` - : `${t('consumption_visualizer.last_valid_data')}`) + - ` : ${ - lastDateWithAllData - ? lastDateWithAllData.toFormat("dd'/'MM'/'yy") - : '-' - }`} - </span> - </div> - )} - </> - ) -} - -export default ErrorDataConsumptionVisualizer diff --git a/src/components/ConsumptionVisualizer/InfoDataConsumptionVisualizer.spec.tsx b/src/components/ConsumptionVisualizer/InfoDataConsumptionVisualizer.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..679d8ca0a069558a5214e2413d7e717f02f42ca0 --- /dev/null +++ b/src/components/ConsumptionVisualizer/InfoDataConsumptionVisualizer.spec.tsx @@ -0,0 +1,240 @@ +import React from 'react' +import { mount } from 'enzyme' +import toJson from 'enzyme-to-json' +import { Provider } from 'react-redux' +import * as reactRedux from 'react-redux' +import { + createMockStore, + mockInitialEcolyoState, +} from '../../../tests/__mocks__/store' +import { FluidType } from 'enum/fluid.enum' +import { Dataload } from 'models' +import { DateTime } from 'luxon' +import InfoDataConsumptionVisualizer from './InfoDataConsumptionVisualizer' +import { DataloadState } from 'enum/dataload.enum' +import NoDataModal from './NoDataModal' +import { baseDataLoad } from '../../../tests/__mocks__/datachartData.mock' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) + +const mockUseDispatch = jest.spyOn(reactRedux, 'useDispatch') + +describe('InfoDataConsumptionVisualizer component', () => { + const mockLastDataDate = DateTime.fromISO('2020-10-01T00:00:00.000Z', { + zone: 'utc', + }) + const mockDataload: Dataload = baseDataLoad + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let store: any + beforeEach(() => { + store = createMockStore(mockInitialEcolyoState) + }) + + it('should render correctly when data valid', () => { + const wrapper = mount( + <Provider store={store}> + <InfoDataConsumptionVisualizer + dataload={mockDataload} + fluidType={FluidType.ELECTRICITY} + lastDataDate={mockLastDataDate} + /> + </Provider> + ) + expect(toJson(wrapper)).toMatchSnapshot() + }) + + describe('should render correctly consumption_visualizer.last_valid_data', () => { + it('case state MISSING', () => { + const _mockdataLoad = { ...mockDataload, state: DataloadState.MISSING } + const wrapper = mount( + <Provider store={store}> + <InfoDataConsumptionVisualizer + dataload={_mockdataLoad} + fluidType={FluidType.ELECTRICITY} + lastDataDate={mockLastDataDate} + /> + </Provider> + ) + expect(wrapper.find('span').text()).toBe( + 'consumption_visualizer.last_valid_data : 01/10/20' + ) + }) + it('case state UPCOMING', () => { + const _mockdataLoad = { ...mockDataload, state: DataloadState.UPCOMING } + const wrapper = mount( + <Provider store={store}> + <InfoDataConsumptionVisualizer + dataload={_mockdataLoad} + fluidType={FluidType.ELECTRICITY} + lastDataDate={mockLastDataDate} + /> + </Provider> + ) + expect(wrapper.find('span').text()).toBe( + 'consumption_visualizer.last_valid_data : 01/10/20' + ) + }) + it('case state COMING', () => { + const _mockdataLoad = { + ...mockDataload, + state: DataloadState.COMING, + } + const wrapper = mount( + <Provider store={store}> + <InfoDataConsumptionVisualizer + dataload={_mockdataLoad} + fluidType={FluidType.ELECTRICITY} + lastDataDate={mockLastDataDate} + /> + </Provider> + ) + expect(wrapper.find('span').text()).toBe( + 'consumption_visualizer.last_valid_data : 01/10/20' + ) + }) + it('case state AGGREGATED_HOLE_OR_MISSING', () => { + const _mockdataLoad = { + ...mockDataload, + state: DataloadState.AGGREGATED_HOLE_OR_MISSING, + } + const wrapper = mount( + <Provider store={store}> + <InfoDataConsumptionVisualizer + dataload={_mockdataLoad} + fluidType={FluidType.MULTIFLUID} + lastDataDate={mockLastDataDate} + /> + </Provider> + ) + expect(wrapper.find('span').text()).toBe( + 'consumption_visualizer.last_valid_data_multi : 01/10/20' + ) + }) + it('case state AGGREGATED_WITH_HOLE_OR_MISSING', () => { + const _mockdataLoad = { + ...mockDataload, + state: DataloadState.AGGREGATED_WITH_HOLE_OR_MISSING, + } + const wrapper = mount( + <Provider store={store}> + <InfoDataConsumptionVisualizer + dataload={_mockdataLoad} + fluidType={FluidType.MULTIFLUID} + lastDataDate={mockLastDataDate} + /> + </Provider> + ) + expect(wrapper.find('span').text()).toBe( + 'consumption_visualizer.last_valid_data_multi : 01/10/20' + ) + }) + it('case state AGGREGATED_COMING', () => { + const _mockdataLoad = { + ...mockDataload, + state: DataloadState.AGGREGATED_COMING, + } + const wrapper = mount( + <Provider store={store}> + <InfoDataConsumptionVisualizer + dataload={_mockdataLoad} + fluidType={FluidType.MULTIFLUID} + lastDataDate={mockLastDataDate} + /> + </Provider> + ) + expect(wrapper.find('span').text()).toBe( + 'consumption_visualizer.last_valid_data_multi : 01/10/20' + ) + }) + }) + + describe('should render correctly with why_no_data', () => { + it('case state EMPTY', () => { + const _mockdataLoad = { ...mockDataload, state: DataloadState.EMPTY } + const wrapper = mount( + <Provider store={store}> + <InfoDataConsumptionVisualizer + dataload={_mockdataLoad} + fluidType={FluidType.ELECTRICITY} + lastDataDate={mockLastDataDate} + /> + </Provider> + ) + expect(wrapper.find('span').text()).toBe( + 'consumption_visualizer.why_no_data' + ) + }) + it('case state HOLE', () => { + const _mockdataLoad = { ...mockDataload, state: DataloadState.HOLE } + const wrapper = mount( + <Provider store={store}> + <InfoDataConsumptionVisualizer + dataload={_mockdataLoad} + fluidType={FluidType.ELECTRICITY} + lastDataDate={mockLastDataDate} + /> + </Provider> + ) + expect(wrapper.find('span').text()).toBe( + 'consumption_visualizer.why_no_data' + ) + }) + it('case state AGGREGATED_EMPTY', () => { + const _mockdataLoad = { + ...mockDataload, + state: DataloadState.AGGREGATED_EMPTY, + } + const wrapper = mount( + <Provider store={store}> + <InfoDataConsumptionVisualizer + dataload={_mockdataLoad} + fluidType={FluidType.MULTIFLUID} + lastDataDate={mockLastDataDate} + /> + </Provider> + ) + expect(wrapper.find('span').text()).toBe( + 'consumption_visualizer.why_no_data' + ) + }) + }) + + it('should click on last valid data date and move to it', async () => { + const _mockdataLoad = { ...mockDataload, state: DataloadState.EMPTY } + const wrapper = mount( + <Provider store={store}> + <InfoDataConsumptionVisualizer + dataload={_mockdataLoad} + fluidType={FluidType.ELECTRICITY} + lastDataDate={mockLastDataDate} + /> + </Provider> + ) + wrapper.find('.error-line').simulate('click') + expect(wrapper.find(NoDataModal).prop('open')).toBeTruthy() + }) + + it('should click to display NoDataModal', async () => { + const _mockdataLoad = { ...mockDataload, state: DataloadState.EMPTY } + const wrapper = mount( + <Provider store={store}> + <InfoDataConsumptionVisualizer + dataload={_mockdataLoad} + fluidType={FluidType.ELECTRICITY} + lastDataDate={mockLastDataDate} + /> + </Provider> + ) + wrapper.find('.error-line').simulate('click') + expect(mockUseDispatch).toHaveBeenCalled() + }) +}) diff --git a/src/components/ConsumptionVisualizer/InfoDataConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/InfoDataConsumptionVisualizer.tsx new file mode 100644 index 0000000000000000000000000000000000000000..030ed6ae736ae4fc95a9830cb25904989d127383 --- /dev/null +++ b/src/components/ConsumptionVisualizer/InfoDataConsumptionVisualizer.tsx @@ -0,0 +1,95 @@ +import React, { useCallback, useState } from 'react' +import './infoDataConsumptionVisualizer.scss' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' +import { useDispatch, useSelector } from 'react-redux' +import { DateTime } from 'luxon' +import { Dataload } from 'models' +import { FluidType } from 'enum/fluid.enum' +import { AppStore } from 'store' +import { setCurrentIndex, setSelectedDate } from 'store/chart/chart.actions' +import DateChartService from 'services/dateChart.service' +import { DataloadState } from 'enum/dataload.enum' +import NoDataModal from './NoDataModal' + +interface InfoDataConsumptionVisualizerProps { + dataload: Dataload + fluidType: FluidType + lastDataDate: DateTime | null +} + +const InfoDataConsumptionVisualizer = ({ + dataload, + fluidType, + lastDataDate, +}: InfoDataConsumptionVisualizerProps) => { + const { t } = useI18n() + const dispatch = useDispatch() + const { currentTimeStep } = useSelector( + (state: AppStore) => state.ecolyo.chart + ) + const [openNodataModal, setopenNodataModal] = useState<boolean>(false) + + const toggleNoDataModal = useCallback(() => { + setopenNodataModal(prev => !prev) + }, []) + + const moveToDate = () => { + if (lastDataDate) { + const dateChartService = new DateChartService() + const updatedIndex: number = dateChartService.defineDateIndex( + currentTimeStep, + lastDataDate + ) + dispatch(setSelectedDate(lastDataDate)) + dispatch(setCurrentIndex(updatedIndex)) + } + } + + if (!dataload) { + return <></> + } + + if ( + dataload.state === DataloadState.MISSING || + dataload.state === DataloadState.UPCOMING || + dataload.state === DataloadState.COMING || + dataload.state === DataloadState.AGGREGATED_HOLE_OR_MISSING || + dataload.state === DataloadState.AGGREGATED_WITH_HOLE_OR_MISSING || + dataload.state === DataloadState.AGGREGATED_COMING + ) { + return ( + <div onClick={() => moveToDate()} className="error-line"> + <span className={`text-16-normal underlined-error`}> + {(fluidType === FluidType.MULTIFLUID + ? `${t('consumption_visualizer.last_valid_data_multi')}` + : `${t('consumption_visualizer.last_valid_data')}`) + + ` : ${lastDataDate ? lastDataDate.toFormat("dd'/'MM'/'yy") : '-'}`} + </span> + </div> + ) + } + + if ( + dataload.state === DataloadState.EMPTY || + dataload.state === DataloadState.HOLE || + dataload.state === DataloadState.AGGREGATED_EMPTY + ) { + return ( + <> + <div className="error-line" onClick={toggleNoDataModal}> + <span className={`text-16-normal underlined-error`}> + {t('consumption_visualizer.why_no_data')} + </span> + </div> + <NoDataModal + open={openNodataModal} + handleCloseClick={toggleNoDataModal} + /> + </> + ) + } + + return <></> +} + +export default InfoDataConsumptionVisualizer diff --git a/src/components/ConsumptionVisualizer/LastDataConsumptionVisualizer.spec.tsx b/src/components/ConsumptionVisualizer/LastDataConsumptionVisualizer.spec.tsx deleted file mode 100644 index b299ed7ac8c16f6e5166ea0356b2a95cac759350..0000000000000000000000000000000000000000 --- a/src/components/ConsumptionVisualizer/LastDataConsumptionVisualizer.spec.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import React from 'react' -import { mount } from 'enzyme' -import { Provider } from 'react-redux' -import * as reactRedux from 'react-redux' - -import configureStore from 'redux-mock-store' -import { mockInitialEcolyoState } from '../../../tests/__mocks__/store' -import LastDataConsumptionVisualizer from './LastDataConsumptionVisualizer' -import { DateTime } from 'luxon' - -jest.mock('cozy-ui/transpiled/react/I18n', () => { - return { - useI18n: jest.fn(() => { - return { - t: (str: string) => str, - } - }), - } -}) - -const mockStore = configureStore([]) -describe('LastDataConsumptionVisualizer component', () => { - it('should render correctly', () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, - }) - const wrapper = mount( - <Provider store={store}> - <LastDataConsumptionVisualizer lastDataDate={null} /> - </Provider> - ) - expect(wrapper).toMatchSnapshot() - }) - it('should click and move to last data date', () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, - }) - const mockUseDispatch = jest.spyOn(reactRedux, 'useDispatch') - - const wrapper = mount( - <Provider store={store}> - <LastDataConsumptionVisualizer lastDataDate={DateTime.local()} /> - </Provider> - ) - wrapper.find('.lastdatavisualizer-button').simulate('click') - expect(mockUseDispatch).toHaveBeenCalled() - }) - it('should render empty last data date', () => { - const store = mockStore({ - ecolyo: mockInitialEcolyoState, - }) - - const wrapper = mount( - <Provider store={store}> - <LastDataConsumptionVisualizer lastDataDate={null} /> - </Provider> - ) - wrapper.find('.lastdatavisualizer-button').simulate('click') - - expect(wrapper.find('.lastdatavisualizer-button').text()).toBe( - 'consumption_visualizer.last_valid_data : -' - ) - }) -}) diff --git a/src/components/ConsumptionVisualizer/LastDataConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/LastDataConsumptionVisualizer.tsx deleted file mode 100644 index a9698fd9c02bfb201f6d83571ff831d3c554da8f..0000000000000000000000000000000000000000 --- a/src/components/ConsumptionVisualizer/LastDataConsumptionVisualizer.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from 'react' -import './lastDataConsumptionVisualizer.scss' -import { useI18n } from 'cozy-ui/transpiled/react/I18n' -import { useDispatch, useSelector } from 'react-redux' -import { AppStore } from 'store' -import { setCurrentIndex, setSelectedDate } from 'store/chart/chart.actions' -import { DateTime } from 'luxon' -import DateChartService from 'services/dateChart.service' -import { FluidType } from 'enum/fluid.enum' - -interface LastDataConsumptionVisualizerProps { - lastDataDate: DateTime | null - fluidType: FluidType -} - -const LastDataConsumptionVisualizer: React.FC<LastDataConsumptionVisualizerProps> = ({ - lastDataDate, - fluidType, -}: LastDataConsumptionVisualizerProps) => { - const { t } = useI18n() - const dispatch = useDispatch() - const { currentTimeStep } = useSelector( - (state: AppStore) => state.ecolyo.chart - ) - - const moveToDate = () => { - if (lastDataDate) { - const dateChartService = new DateChartService() - const updatedIndex: number = dateChartService.defineDateIndex( - currentTimeStep, - lastDataDate - ) - dispatch(setSelectedDate(lastDataDate)) - dispatch(setCurrentIndex(updatedIndex)) - } - } - - return ( - <div onClick={() => moveToDate()} className="lastdatavisualizer-button"> - <span className={`text-16-normal underlined-error`}> - {(fluidType && fluidType === FluidType.MULTIFLUID - ? `${t('consumption_visualizer.last_valid_data_multi')}` - : `${t('consumption_visualizer.last_valid_data')}`) + - ` : ${lastDataDate ? lastDataDate.toFormat("dd'/'MM'/'yy") : '-'}`} - </span> - </div> - ) -} - -export default LastDataConsumptionVisualizer diff --git a/src/components/ConsumptionVisualizer/__snapshots__/DataloadComparisonLeft.spec.tsx.snap b/src/components/ConsumptionVisualizer/__snapshots__/DataloadComparisonLeft.spec.tsx.snap deleted file mode 100644 index 9f5722378e8098a9a2321df5c7889b97c9915583..0000000000000000000000000000000000000000 --- a/src/components/ConsumptionVisualizer/__snapshots__/DataloadComparisonLeft.spec.tsx.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`DataloadComparisonLeft component should render correctly 1`] = `ReactWrapper {}`; diff --git a/src/components/ConsumptionVisualizer/__snapshots__/DataloadNoValue.spec.tsx.snap b/src/components/ConsumptionVisualizer/__snapshots__/DataloadNoValue.spec.tsx.snap index 372c0275b86ca025a7d34130d5e958f91305de12..e70438172e75594f67fc1bfd8b2a592df5b78e1f 100644 --- a/src/components/ConsumptionVisualizer/__snapshots__/DataloadNoValue.spec.tsx.snap +++ b/src/components/ConsumptionVisualizer/__snapshots__/DataloadNoValue.spec.tsx.snap @@ -1,3 +1,30 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`DataloadNoValue component should render correctly 1`] = `ReactWrapper {}`; +exports[`DataloadNoValue component should render correctly 1`] = ` +<DataloadNoValue + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "VALID", + "value": 12, + "valueDetail": null, + } + } + fluidType={0} + setActive={[MockFunction]} +> + <div + className="dataloadvisualizer-content text-22-normal" + > + <div + className="dataloadvisualizer-section" + > + <div + className="dataloadvisualizer-value electricity upper to-come" + > + consumption_visualizer.data_to_come + </div> + </div> + </div> +</DataloadNoValue> +`; diff --git a/src/components/ConsumptionVisualizer/__snapshots__/DataloadSection.spec.tsx.snap b/src/components/ConsumptionVisualizer/__snapshots__/DataloadSection.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..325b7cc8616a4a6658bc4675860cc86b99c37c9f --- /dev/null +++ b/src/components/ConsumptionVisualizer/__snapshots__/DataloadSection.spec.tsx.snap @@ -0,0 +1,51 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`DataloadSection component should render correctly 1`] = ` +<DataloadSection + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "VALID", + "value": 12, + "valueDetail": null, + } + } + dataloadSectionType="NO_COMPARE" + fluidType={0} + toggleEstimationModal={[MockFunction]} +> + <div + className="dataloadvisualizer-section" + > + <div + className="dataloadvisualizer-value text-36-bold electricity" + > + <mock-dataloadsectionvalue + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "VALID", + "value": 12, + "valueDetail": null, + } + } + dataloadSectionType="NO_COMPARE" + fluidType={0} + toggleEstimationModal={[MockFunction]} + /> + </div> + <mock-dataloadsectiondetail + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "VALID", + "value": 12, + "valueDetail": null, + } + } + dataloadSectionType="NO_COMPARE" + fluidType={0} + /> + </div> +</DataloadSection> +`; diff --git a/src/components/ConsumptionVisualizer/__snapshots__/DataloadSectionDetail.spec.tsx.snap b/src/components/ConsumptionVisualizer/__snapshots__/DataloadSectionDetail.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..8a77ee10d05efd830cedb86e08a933b02803b93d --- /dev/null +++ b/src/components/ConsumptionVisualizer/__snapshots__/DataloadSectionDetail.spec.tsx.snap @@ -0,0 +1,188 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`DataloadSectionDetail component should display value details if multifluid and no comparison case all valid data 1`] = ` +<DataloadSectionDetail + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "AGGREGATED_VALID", + "value": 12, + "valueDetail": Array [ + Object { + "state": "VALID", + "value": 1, + }, + Object { + "state": "VALID", + "value": 2, + }, + Object { + "state": "VALID", + "value": 3, + }, + ], + } + } + dataloadSectionType="RIGHT" + fluidType={3} +> + <div + className="dataloadvisualizer-euro text-16-normal" + /> +</DataloadSectionDetail> +`; + +exports[`DataloadSectionDetail component should display value details if multifluid and no comparison case valid and coming data 1`] = ` +<DataloadSectionDetail + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "AGGREGATED_WITH_UPCOMING", + "value": 12, + "valueDetail": Array [ + Object { + "state": "VALID", + "value": 1, + }, + Object { + "state": "COMING", + "value": -1, + }, + Object { + "state": "VALID", + "value": 3, + }, + ], + } + } + dataloadSectionType="RIGHT" + fluidType={3} +> + <div + className="dataloadvisualizer-euro text-16-normal" + /> +</DataloadSectionDetail> +`; + +exports[`DataloadSectionDetail component should display value details if multifluid and no comparison case valid and hole data 1`] = ` +<DataloadSectionDetail + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "AGGREGATED_WITH_HOLE_OR_MISSING", + "value": 12, + "valueDetail": Array [ + Object { + "state": "VALID", + "value": 1, + }, + Object { + "state": "HOLE", + "value": -1, + }, + Object { + "state": "VALID", + "value": 3, + }, + ], + } + } + dataloadSectionType="RIGHT" + fluidType={3} +> + <div + className="dataloadvisualizer-euro text-16-normal" + /> +</DataloadSectionDetail> +`; + +exports[`DataloadSectionDetail component should display value details if multifluid and no comparison case valid and missing data 1`] = ` +<DataloadSectionDetail + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "AGGREGATED_WITH_HOLE_OR_MISSING", + "value": 12, + "valueDetail": Array [ + Object { + "state": "VALID", + "value": 1, + }, + Object { + "state": "MISSING", + "value": -1, + }, + Object { + "state": "VALID", + "value": 3, + }, + ], + } + } + dataloadSectionType="RIGHT" + fluidType={3} +> + <div + className="dataloadvisualizer-euro text-16-normal" + /> +</DataloadSectionDetail> +`; + +exports[`DataloadSectionDetail component should not display if multifluid and comparison 1`] = ` +<DataloadSectionDetail + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "VALID", + "value": 12, + "valueDetail": null, + } + } + dataloadSectionType="RIGHT" + fluidType={3} +> + <div + className="dataloadvisualizer-euro text-16-normal" + /> +</DataloadSectionDetail> +`; + +exports[`DataloadSectionDetail component should not display value details if multifluid, no valueDetail and comparison 1`] = ` +<DataloadSectionDetail + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "AGGREGATED_EMPTY", + "value": 12, + "valueDetail": null, + } + } + dataloadSectionType="RIGHT" + fluidType={3} +> + <div + className="dataloadvisualizer-euro text-16-normal" + /> +</DataloadSectionDetail> +`; + +exports[`DataloadSectionDetail component should render correctly 1`] = ` +<DataloadSectionDetail + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "VALID", + "value": 12, + "valueDetail": null, + } + } + dataloadSectionType="NO_COMPARE" + fluidType={0} +> + <div + className="dataloadvisualizer-euro text-16-normal electricity" + > + 2,09 € + </div> +</DataloadSectionDetail> +`; diff --git a/src/components/ConsumptionVisualizer/__snapshots__/DataloadSectionValue.spec.tsx.snap b/src/components/ConsumptionVisualizer/__snapshots__/DataloadSectionValue.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..ba54ac2c063fd7a1ee4845f20d13e328aa999872 --- /dev/null +++ b/src/components/ConsumptionVisualizer/__snapshots__/DataloadSectionValue.spec.tsx.snap @@ -0,0 +1,24 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`DataloadSectionValue component should render correctly 1`] = ` +<DataloadSectionValue + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "VALID", + "value": 12, + "valueDetail": null, + } + } + dataloadSectionType="NO_COMPARE" + fluidType={0} + toggleEstimationModal={[MockFunction]} +> + 12,00 + <span + className="text-18-normal" + > + FLUID.ELECTRICITY.UNIT + </span> +</DataloadSectionValue> +`; diff --git a/src/components/ConsumptionVisualizer/__snapshots__/ErrorDataConsumptionVisualizer.spec.tsx.snap b/src/components/ConsumptionVisualizer/__snapshots__/ErrorDataConsumptionVisualizer.spec.tsx.snap deleted file mode 100644 index a95a17a508f07a2b3deb2ec4954baee60bae12e4..0000000000000000000000000000000000000000 --- a/src/components/ConsumptionVisualizer/__snapshots__/ErrorDataConsumptionVisualizer.spec.tsx.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ErrorDataConsumptionVisualizer component should render correctly 1`] = `ReactWrapper {}`; diff --git a/src/components/ConsumptionVisualizer/__snapshots__/InfoDataConsumptionVisualizer.spec.tsx.snap b/src/components/ConsumptionVisualizer/__snapshots__/InfoDataConsumptionVisualizer.spec.tsx.snap new file mode 100644 index 0000000000000000000000000000000000000000..151a98bdd258e3755248640676bf77b747bab782 --- /dev/null +++ b/src/components/ConsumptionVisualizer/__snapshots__/InfoDataConsumptionVisualizer.spec.tsx.snap @@ -0,0 +1,29 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`InfoDataConsumptionVisualizer component should render correctly when data valid 1`] = ` +<Provider + store={ + Object { + "clearActions": [Function], + "dispatch": [Function], + "getActions": [Function], + "getState": [Function], + "replaceReducer": [Function], + "subscribe": [Function], + } + } +> + <InfoDataConsumptionVisualizer + dataload={ + Object { + "date": "2021-09-23T00:00:00.000Z", + "state": "VALID", + "value": 12, + "valueDetail": null, + } + } + fluidType={0} + lastDataDate={"2020-10-01T00:00:00.000Z"} + /> +</Provider> +`; diff --git a/src/components/ConsumptionVisualizer/__snapshots__/LastDataConsumptionVisualizer.spec.tsx.snap b/src/components/ConsumptionVisualizer/__snapshots__/LastDataConsumptionVisualizer.spec.tsx.snap deleted file mode 100644 index c10fc2c6145b8fb653eec9d764fc072a23347229..0000000000000000000000000000000000000000 --- a/src/components/ConsumptionVisualizer/__snapshots__/LastDataConsumptionVisualizer.spec.tsx.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`LastDataConsumptionVisualizer component should render correctly 1`] = `ReactWrapper {}`; diff --git a/src/components/ConsumptionVisualizer/dataloadConsumptionVisualizer.scss b/src/components/ConsumptionVisualizer/dataloadConsumptionVisualizer.scss index 5efbd3ae93f2f5aca6f39bdc4f702df8a7e819b7..d7c31f56252b7913e0ba71ec1514c320bab647d1 100644 --- a/src/components/ConsumptionVisualizer/dataloadConsumptionVisualizer.scss +++ b/src/components/ConsumptionVisualizer/dataloadConsumptionVisualizer.scss @@ -2,7 +2,7 @@ @import 'src/styles/base/breakpoint'; .dataloadvisualizer-root { - min-height: 5rem; + min-height: 5.719rem; display: flex; align-items: center; } diff --git a/src/components/ConsumptionVisualizer/errorDataConsumptionVisualizer.scss b/src/components/ConsumptionVisualizer/infoDataConsumptionVisualizer.scss similarity index 100% rename from src/components/ConsumptionVisualizer/errorDataConsumptionVisualizer.scss rename to src/components/ConsumptionVisualizer/infoDataConsumptionVisualizer.scss diff --git a/src/components/ConsumptionVisualizer/lastDataConsumptionVisualizer.scss b/src/components/ConsumptionVisualizer/lastDataConsumptionVisualizer.scss deleted file mode 100644 index 8554a2ca1c28f6d2923e4febc9dd3dbeb9f37d4c..0000000000000000000000000000000000000000 --- a/src/components/ConsumptionVisualizer/lastDataConsumptionVisualizer.scss +++ /dev/null @@ -1,8 +0,0 @@ -@import 'src/styles/base/color'; - -.lastdatavisualizer-button { - color: $grey-bright; - cursor: pointer; - display: flex; - align-items: center; -} diff --git a/src/components/EcogestureForm/EcogestureFormView.spec.tsx b/src/components/EcogestureForm/EcogestureFormView.spec.tsx index 8d6c77f09e895fc6da10344b15b3ef2d571e81c7..e3e0cbce3cc84773501f7aa58d87eb5de7631303 100644 --- a/src/components/EcogestureForm/EcogestureFormView.spec.tsx +++ b/src/components/EcogestureForm/EcogestureFormView.spec.tsx @@ -99,7 +99,6 @@ describe('EcogestureFormView component', () => { .first() .simulate('change') await waitForComponentToPaint(wrapper) - console.log(wrapper.debug()) wrapper .find(Button) .at(1) diff --git a/src/components/FluidChart/FluidChartSlide.tsx b/src/components/FluidChart/FluidChartSlide.tsx index c459e9c770eac57c3004a309f1742baa663181c2..59847d745905852a7684ba00f5ccd80e2152bc7c 100644 --- a/src/components/FluidChart/FluidChartSlide.tsx +++ b/src/components/FluidChart/FluidChartSlide.tsx @@ -40,7 +40,9 @@ const FluidChartSlide: React.FC<FluidChartSlideProps> = ({ const { currentTimeStep, currentIndex } = useSelector( (state: AppStore) => state.ecolyo.chart ) - const { fluidTypes } = useSelector((state: AppStore) => state.ecolyo.global) + const { fluidTypes, fluidStatus } = useSelector( + (state: AppStore) => state.ecolyo.global + ) const [chartData, setChartData] = useState<Datachart>({ actualData: [], comparisonData: null, @@ -83,6 +85,7 @@ const FluidChartSlide: React.FC<FluidChartSlideProps> = ({ timePeriod, currentTimeStep, fluidTypeArray, + fluidStatus, compareTimePeriod, fluidType === FluidType.MULTIFLUID ) @@ -107,6 +110,7 @@ const FluidChartSlide: React.FC<FluidChartSlideProps> = ({ index, isDataLoaded, timeStep, + fluidStatus, ]) useEffect(() => { diff --git a/src/components/Home/ConsumptionView.spec.tsx b/src/components/Home/ConsumptionView.spec.tsx index 4466cc773f1e8cde73ab0f51d5f884e68edc06ad..a272d2bf25de666933374873ca1bbaec1ffd4698 100644 --- a/src/components/Home/ConsumptionView.spec.tsx +++ b/src/components/Home/ConsumptionView.spec.tsx @@ -5,6 +5,7 @@ import { Provider } from 'react-redux' import * as reactRedux from 'react-redux' import { createMockStore, + mockExpiredElec, mockInitialEcolyoState, } from '../../../tests/__mocks__/store' import * as chartActions from 'store/chart/chart.actions' @@ -13,24 +14,8 @@ import { TimeStep } from 'enum/timeStep.enum' import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner' import ConsumptionView from './ConsumptionView' import { FluidStatus } from 'models' +import { mockTestProfile1 } from '../../../tests/__mocks__/profileType.mock' -jest.mock('components/Header/CozyBar', () => () => <div id="cozybar"></div>) -jest.mock('components/Header/Header', () => () => <div id="header"></div>) -jest.mock('components/DateNavigator/DateNavigator', () => () => ( - <div id="datenavigator"></div> -)) -jest.mock('components/FluidChart/FluidChart', () => () => ( - <div id="fluidchart"></div> -)) -jest.mock('components/Home/ConsumptionDetails', () => () => ( - <div id="consumptiondetails"></div> -)) -jest.mock('components/Connection/Connection', () => () => ( - <div id="connection"></div> -)) -jest.mock('components/Konnector/KonnectorViewerCard', () => () => ( - <div id="konnectorViewerCard"></div> -)) jest.mock('cozy-ui/transpiled/react/I18n', () => { return { useI18n: jest.fn(() => { @@ -40,6 +25,36 @@ jest.mock('cozy-ui/transpiled/react/I18n', () => { }), } }) +const mockUpdateProfile = jest.fn() +jest.mock('services/profile.service', () => { + return jest.fn(() => { + return { + updateProfile: mockUpdateProfile, + } + }) +}) + +jest.mock('components/Header/CozyBar', () => 'mock-cozybar') +jest.mock('components/Header/Header', () => 'mock-header') +jest.mock('components/DateNavigator/DateNavigator', () => 'mock-datenavigator') +jest.mock('components/Content/Content', () => 'mock-content') +jest.mock('components/Home/FluidButtons', () => 'mock-fluidbuttons') +jest.mock('components/FluidChart/FluidChart', () => 'mock-fluidchart') +jest.mock('components/Home/ConsumptionDetails', () => 'mock-consumptiondetails') +jest.mock('components/Connection/Connection', () => 'mock-connection') +jest.mock( + 'components/Konnector/KonnectorViewerCard', + () => 'mock-konnectorviewercard' +) +jest.mock( + 'components/PartnersIssue/PartnersIssueModal', + () => 'mock-partnersissuemodal' +) +jest.mock( + 'components/Connection/ExpiredConsentModal', + () => 'mock-expiredconsentmodal' +) + const useSelectorSpy = jest.spyOn(reactRedux, 'useSelector') const useDispatchSpy = jest.spyOn(reactRedux, 'useDispatch') const setCurrentTimeStepSpy = jest.spyOn(chartActions, 'setCurrentTimeStep') @@ -54,10 +69,13 @@ describe('ConsumptionView component', () => { }) it('should be rendered correctly', async () => { + const mockFluidStatus: FluidStatus[] = + mockInitialEcolyoState.global.fluidStatus + mockFluidStatus[FluidType.ELECTRICITY].status = FluidState.DONE useSelectorSpy.mockReturnValue({ currentTimeStep: TimeStep.WEEK, loading: false, - fluidStatus: mockInitialEcolyoState.global.fluidStatus, + fluidStatus: mockFluidStatus, releaseNotes: mockInitialEcolyoState.global.releaseNotes, }) const wrapper = mount( @@ -65,18 +83,22 @@ describe('ConsumptionView component', () => { <ConsumptionView fluidType={FluidType.ELECTRICITY} /> </Provider> ) - expect(wrapper.find('#cozybar')).toBeTruthy() - expect(wrapper.find('#header')).toBeTruthy() - expect(wrapper.find('#datenavigator')).toBeTruthy() - expect(wrapper.find('#fluidchart')).toBeTruthy() - expect(wrapper.find('#consumptiondetails')).toBeTruthy() + expect(wrapper.find('mock-cozybar').exists()).toBeTruthy() + expect(wrapper.find('mock-header').exists()).toBeTruthy() + expect(wrapper.find('mock-datenavigator').exists()).toBeTruthy() + expect(wrapper.find('mock-fluidbuttons').exists()).toBeTruthy() + expect(wrapper.find('mock-fluidchart').exists()).toBeTruthy() + expect(wrapper.find('mock-consumptiondetails').exists()).toBeTruthy() }) - it('should display a spinner', () => { + it('should display a spinner when fluid connected and is loading', () => { + const mockFluidStatus: FluidStatus[] = + mockInitialEcolyoState.global.fluidStatus + mockFluidStatus[FluidType.ELECTRICITY].status = FluidState.DONE useSelectorSpy.mockReturnValue({ currentTimeStep: TimeStep.WEEK, loading: true, - fluidStatus: mockInitialEcolyoState.global.fluidStatus, + fluidStatus: mockFluidStatus, releaseNotes: mockInitialEcolyoState.global.releaseNotes, }) const wrapper = mount( @@ -84,10 +106,10 @@ describe('ConsumptionView component', () => { <ConsumptionView fluidType={FluidType.ELECTRICITY} /> </Provider> ) - expect(wrapper.find('#cozybar')).toBeTruthy() - expect(wrapper.find('#header')).toBeTruthy() - expect(wrapper.find('#datenavigator')).toBeTruthy() - expect(wrapper.find(StyledSpinner)).toBeTruthy() + expect(wrapper.find('mock-cozybar').exists()).toBeTruthy() + expect(wrapper.find('mock-header').exists()).toBeTruthy() + expect(wrapper.find('mock-datenavigator').exists()).toBeTruthy() + expect(wrapper.find(StyledSpinner).exists()).toBeTruthy() }) it('should set CurrentTimeStep to WEEK when fluid != ELECTRICITY and timeStep = HALF_AN_HOUR', () => { @@ -117,7 +139,7 @@ describe('ConsumptionView component', () => { <ConsumptionView fluidType={FluidType.MULTIFLUID} /> </Provider> ) - expect(wrapper.find('.konnectorViewerCard')).toBeTruthy() + expect(wrapper.find('mock-consumptiondetails').exists()).toBeTruthy() }) it('should render mutlifluid consumption if at least one fluid is connected', () => { const updatedStatus: FluidStatus[] = @@ -135,7 +157,7 @@ describe('ConsumptionView component', () => { <ConsumptionView fluidType={FluidType.MULTIFLUID} /> </Provider> ) - expect(wrapper.find('.consumptionview-content')).toBeTruthy() + expect(wrapper.find('.consumptionview-content').exists()).toBeTruthy() }) it('should render Electricity when elec is connected', () => { const updatedStatus: FluidStatus[] = @@ -152,7 +174,46 @@ describe('ConsumptionView component', () => { <ConsumptionView fluidType={FluidType.ELECTRICITY} /> </Provider> ) - expect(wrapper.find('.consumptionview-content')).toBeTruthy() - expect(wrapper.find('.konnectorViewerCard')).toBeTruthy() + expect(wrapper.find('.consumptionview-content').exists()).toBeTruthy() + expect(wrapper.find('mock-consumptiondetails').exists()).toBeTruthy() + }) + it('should show partner issue Modal', async () => { + const updatedStatus: FluidStatus[] = + mockInitialEcolyoState.global.fluidStatus + updatedStatus[0] = mockExpiredElec + useSelectorSpy.mockReturnValue({ + currentTimeStep: TimeStep.WEEK, + loading: true, + fluidStatus: updatedStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + openPartnersIssueModal: true, + }) + useDispatchSpy.mockReturnValue(jest.fn()) + mockUpdateProfile.mockResolvedValue(mockTestProfile1) + const wrapper = mount( + <Provider store={store}> + <ConsumptionView fluidType={FluidType.ELECTRICITY} /> + </Provider> + ) + expect(wrapper.find('mock-partnersissuemodal').exists()).toBeTruthy() + }) + it('should show expired modal when a fluid oauth is expired', () => { + const updatedStatus: FluidStatus[] = + mockInitialEcolyoState.global.fluidStatus + updatedStatus[0] = mockExpiredElec + useSelectorSpy.mockReturnValue({ + currentTimeStep: TimeStep.WEEK, + loading: true, + fluidStatus: updatedStatus, + releaseNotes: mockInitialEcolyoState.global.releaseNotes, + openPartnersIssueModal: false, + }) + useDispatchSpy.mockReturnValue(jest.fn()) + const wrapper = mount( + <Provider store={store}> + <ConsumptionView fluidType={FluidType.MULTIFLUID} /> + </Provider> + ) + expect(wrapper.find('mock-expiredconsentmodal').exists()).toBeTruthy() }) }) diff --git a/src/components/Home/ConsumptionView.tsx b/src/components/Home/ConsumptionView.tsx index 165429fad00f3124df713a9b68923c91f4f8083e..9902d21d2fabe01e8dcc6c2cb11b177bb86e967e 100644 --- a/src/components/Home/ConsumptionView.tsx +++ b/src/components/Home/ConsumptionView.tsx @@ -17,13 +17,14 @@ import FluidButtons from 'components/Home/FluidButtons' import KonnectorViewerCard from 'components/Konnector/KonnectorViewerCard' import KonnectorViewerList from 'components/Konnector/KonnectorViewerList' import classNames from 'classnames' -import { isKonnectorActive } from 'utils/utils' +import { getKonnectorUpdateError, isKonnectorActive } from 'utils/utils' import ReleaseNotesModal from './releaseNotesModal' import { setPartnersIssue, showReleaseNotes } from 'store/global/global.actions' import PartnersIssueModal from 'components/PartnersIssue/PartnersIssueModal' import ProfileService from 'services/profile.service' import { useClient } from 'cozy-client' import { DateTime } from 'luxon' +import ExpiredConsentModal from 'components/Connection/ExpiredConsentModal' interface ConsumptionViewProps { fluidType: FluidType @@ -48,7 +49,12 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ const [headerHeight, setHeaderHeight] = useState<number>(0) const [active, setActive] = useState<boolean>(false) - + const [openExpiredConsentModal, setopenExpiredConsentModal] = useState< + boolean + >(true) + const [consentExpiredFluids, setconsentExpiredFluids] = useState<FluidType[]>( + [] + ) /* eslint-disable @typescript-eslint/no-non-null-assertion */ const updatekey = @@ -100,6 +106,26 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ dispatch(setLoading(true)) }, [dispatch]) + useEffect(() => { + let subscribed = true + //Check if some fluids have expired consent error + const expiredConsents = [] + for (const fluid of fluidStatus) { + if ( + fluid.connection.triggerState && + fluid.connection.triggerState.last_error && + getKonnectorUpdateError(fluid.connection.triggerState.last_error) === + 'error_update_oauth' + ) { + expiredConsents.push(fluid.fluidType) + } + } + if (subscribed) setconsentExpiredFluids(expiredConsents) + return () => { + subscribed = false + } + }, [fluidStatus]) + return ( <> <CozyBar titleKey={'navigation.consumption'} /> @@ -143,6 +169,7 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ isDisconnected={false} setActive={setActive} active={active} + key={fluidType} /> </div> )} @@ -170,6 +197,17 @@ const ConsumptionView: React.FC<ConsumptionViewProps> = ({ fluidStatus={fluidStatus} handleCloseClick={handleCloseModal} /> + {consentExpiredFluids.length && + consentExpiredFluids.map(fluid => { + return ( + <ExpiredConsentModal + key={fluid} + open={openExpiredConsentModal} + handleCloseClick={() => setopenExpiredConsentModal(false)} + fluidType={fluid} + /> + ) + })} </> ) } diff --git a/src/components/Konnector/KonnectorModal.tsx b/src/components/Konnector/KonnectorModal.tsx index d0c63bae9d7e96c47a8ba420198204dde343515a..9723f507ab8ff8cf2392e4aec7b2715a1f5b803b 100644 --- a/src/components/Konnector/KonnectorModal.tsx +++ b/src/components/Konnector/KonnectorModal.tsx @@ -63,7 +63,7 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ useEffect(() => { const interval = setInterval(() => { - if (open && (!state || state === LOGIN_SUCCESS_EVENT)) { + if (open && !state) { setIndex((prev: number) => prev + 1) } }, 8000) @@ -132,32 +132,6 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({ ) : ( <> <div className="kmodal-info"> - {state === LOGIN_SUCCESS_EVENT && ( - <> - <Lottie - options={loadingOptions} - height={50} - width={50} - speed={2} - /> - <div className="kc-wait text-16-bold"> - {t(`konnector_modal.loading_data`)} - </div> - <div className="kmodal-waiting-text text-18-italic"> - {shuffledWaitingTexts.map((text, idx) => ( - <div - key={idx} - className={classNames('waiting-text', { - ['show']: idx === index % shuffledWaitingTexts.length, - })} - > - <p>{text.first}</p> - <p>{text.second}</p> - </div> - ))} - </div> - </> - )} {state === ERROR_EVENT && ( <> {error === 'LOGIN_FAILED' ? ( diff --git a/src/components/Konnector/KonnectorViewerCard.tsx b/src/components/Konnector/KonnectorViewerCard.tsx index 5b95d8fe68ca1e6ffbc791ef46fda20c1e7ba2e4..d4c8098182432dc432703aca2fac730798208c73 100644 --- a/src/components/Konnector/KonnectorViewerCard.tsx +++ b/src/components/Konnector/KonnectorViewerCard.tsx @@ -25,7 +25,6 @@ import { updatedFluidConnection, } from 'store/global/global.actions' import FluidService from 'services/fluid.service' -import InitializationService from 'services/initialization.service' import ChallengeService from 'services/challenge.service' import AccountService from 'services/account.service' @@ -83,7 +82,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ const konnector: Konnector | null = fluidStatus.connection.konnector const account: Account | null = fluidStatus.connection.account const trigger: Trigger | null = fluidStatus.connection.trigger - const { fluidStatus: statusArray } = useSelector( + const { fluidStatus: statusArray, shouldRefreshConsent } = useSelector( (state: AppStore) => state.ecolyo.global ) @@ -108,8 +107,8 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ /* eslint-disable @typescript-eslint/no-non-null-assertion */ const lastDataDate = fluidType !== FluidType.MULTIFLUID && statusArray[fluidType].lastDataDate - ? statusArray[fluidType].lastDataDate!.toLocaleString() - : '' + ? statusArray[fluidType].lastDataDate!.toLocaleString() + fluidType + : fluidType const iconType = getParamPicto(fluidStatus.fluidType) const iconAddType = isParam @@ -145,14 +144,13 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ currentChallenge.state === UserChallengeState.DUEL && currentChallenge.duel.state === UserDuelState.ONGOING ) { - const initializationService = new InitializationService(client) + const challengeService = new ChallengeService(client) const { updatedUserChallenge, dataloads, - } = await initializationService.initDuelProgress(currentChallenge) + } = await challengeService.initChallengeDuelProgress(currentChallenge) dispatch(setChallengeConsumption(updatedUserChallenge, dataloads)) // Check is duel is done and display notification - const challengeService = new ChallengeService(client) const { isDone } = await challengeService.isChallengeDone( updatedUserChallenge, dataloads @@ -286,14 +284,18 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ const callbackResponse = useCallback( async (_state: string) => { - const updatedConnection: FluidConnection = { - ...fluidStatus.connection, - shouldLaunchKonnector: false, + if (_state !== LOGIN_SUCCESS_EVENT) { + const updatedConnection: FluidConnection = { + ...fluidStatus.connection, + shouldLaunchKonnector: false, + } + dispatch( + updatedFluidConnection(fluidStatus.fluidType, updatedConnection) + ) + await refreshChallengeState() + await updateGlobalFluidStatus() + setKonnectorState(_state) } - dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection)) - await refreshChallengeState() - await updateGlobalFluidStatus() - setKonnectorState(_state) }, [ dispatch, @@ -352,6 +354,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ client, konnector, trigger, + fluidStatus.connection, fluidStatus.connection.shouldLaunchKonnector, fluidStatus.connection.isUpdating, fluidStatus.fluidType, @@ -362,7 +365,21 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ sendUsageEventError, fluidSlug, sendUsageEventSuccess, + fluidStatus.connection, ]) + + useEffect(() => { + // If user has selected accept button on Expired consent modal, then delete its account + async function deleteAccountForConsentRefresh() { + if (shouldRefreshConsent && account) { + const accountService = new AccountService(client) + await accountService.deleteAccount(account) + await handleAccountDeletion() + } + } + deleteAccountForConsentRefresh() + }, [account, client, handleAccountDeletion, shouldRefreshConsent]) + return ( <> {!isDisconnected ? ( diff --git a/src/components/Options/ReportOptions.tsx b/src/components/Options/ReportOptions.tsx index 2fa99ed47c733088ed18f59fd51a57ccd14b6322..5a74cb99020ea89de6f4aaf77990b3bbae8f1cbb 100644 --- a/src/components/Options/ReportOptions.tsx +++ b/src/components/Options/ReportOptions.tsx @@ -150,7 +150,11 @@ const ReportOptions: React.FC = () => { <input className="input-style" type={'number'} - defaultValue={profile.waterDailyConsumptionLimit} + defaultValue={ + profile.waterDailyConsumptionLimit === 0 + ? '' + : profile.waterDailyConsumptionLimit + } onBlur={setWaterLimit} aria-label={t( 'profile.accessibility.input_water_alert_report' diff --git a/src/components/PartnersIssue/PartnersIssueModal.tsx b/src/components/PartnersIssue/PartnersIssueModal.tsx index 68a048023fb21988e5eab605fbee962be8f6f20d..84a49f61d48be1006412829b5198450b3742102d 100644 --- a/src/components/PartnersIssue/PartnersIssueModal.tsx +++ b/src/components/PartnersIssue/PartnersIssueModal.tsx @@ -78,7 +78,7 @@ const PartnersIssueModal: React.FC<PartnersIssueModalProps> = ({ <Button onClick={handleCloseClick} classes={{ - root: 'btn-highlight', + root: 'btn-highlight partnermodalclose', label: 'text-16-bold', }} > diff --git a/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap b/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap index 83470054297327e1b1148148befc710d973a1e5d..f3a773803581b4d3dcc445c61ef957e9a02f5af9 100644 --- a/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap +++ b/src/components/PartnersIssue/__snapshots__/PartnersIssueModal.spec.tsx.snap @@ -32,6 +32,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "trigger": null, "triggerState": null, }, + "firstDataDate": null, "fluidType": 0, "lastDataDate": null, "status": 0, @@ -52,6 +53,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "trigger": null, "triggerState": null, }, + "firstDataDate": null, "fluidType": 1, "lastDataDate": null, "status": 0, @@ -72,6 +74,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "trigger": null, "triggerState": null, }, + "firstDataDate": null, "fluidType": 2, "lastDataDate": null, "status": 0, @@ -537,7 +540,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` consumption.partners_issue_modal.text_2 </div> <button - class="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + class="MuiButtonBase-root MuiButton-root btn-highlight partnermodalclose MuiButton-text" tabindex="0" type="button" > @@ -946,7 +949,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` classes={ Object { "label": "text-16-bold", - "root": "btn-highlight", + "root": "btn-highlight partnermodalclose", } } onClick={[MockFunction]} @@ -974,7 +977,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` "outlinedSecondary": "MuiButton-outlinedSecondary", "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", - "root": "MuiButton-root btn-highlight", + "root": "MuiButton-root btn-highlight partnermodalclose", "sizeLarge": "MuiButton-sizeLarge", "sizeSmall": "MuiButton-sizeSmall", "startIcon": "MuiButton-startIcon", @@ -988,7 +991,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` onClick={[MockFunction]} > <WithStyles(ForwardRef(ButtonBase)) - className="MuiButton-root btn-highlight MuiButton-text" + className="MuiButton-root btn-highlight partnermodalclose MuiButton-text" component="button" disabled={false} focusRipple={true} @@ -997,7 +1000,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` type="button" > <ForwardRef(ButtonBase) - className="MuiButton-root btn-highlight MuiButton-text" + className="MuiButton-root btn-highlight partnermodalclose MuiButton-text" classes={ Object { "disabled": "Mui-disabled", @@ -1013,7 +1016,7 @@ exports[`PartnersIssueModal component should render correctly 1`] = ` type="button" > <button - className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text" + className="MuiButtonBase-root MuiButton-root btn-highlight partnermodalclose MuiButton-text" disabled={false} onBlur={[Function]} onClick={[MockFunction]} diff --git a/src/components/Splash/SplashRoot.spec.tsx b/src/components/Splash/SplashRoot.spec.tsx index c8da7353f415908be3022cabb34fd1a588a508c0..f6f54888929a9420023f7b050255492211417241 100644 --- a/src/components/Splash/SplashRoot.spec.tsx +++ b/src/components/Splash/SplashRoot.spec.tsx @@ -1,11 +1,20 @@ import React from 'react' -import { shallow } from 'enzyme' +import { mount } from 'enzyme' import SplashRoot from './SplashRoot' import * as reactRedux from 'react-redux' -import SplashScreen from './SplashScreen' -import SplashScreenError from './SplashScreenError' +import toJson from 'enzyme-to-json' + import { userChallengeExplo1OnGoing } from '../../../tests/__mocks__/userChallengeData.mock' +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) const mockUseSelector = jest.spyOn(reactRedux, 'useSelector') const mockUseDispatch = jest.spyOn(reactRedux, 'useDispatch') @@ -13,14 +22,7 @@ describe('SplashRoot component', () => { it('should be rendered correctly', () => { mockUseSelector.mockReturnValue(userChallengeExplo1OnGoing) mockUseDispatch.mockReturnValue(jest.fn()) - const component = shallow( - <SplashRoot - splashComponent={SplashScreen} - splashErrorComponent={SplashScreenError} - > - children - </SplashRoot> - ).getElement() - expect(component).toMatchSnapshot() + const component = mount(<SplashRoot>children</SplashRoot>).getElement() + expect(toJson(component)).toMatchSnapshot() }) }) diff --git a/src/components/Splash/SplashRoot.tsx b/src/components/Splash/SplashRoot.tsx index 12719870f0514736462054edce1161d25f721eaf..b7b56ecd6c0ef9971b97d2d17348c9572fd1e8f7 100644 --- a/src/components/Splash/SplashRoot.tsx +++ b/src/components/Splash/SplashRoot.tsx @@ -1,10 +1,4 @@ -import React, { - useState, - useEffect, - ComponentType, - ReactNode, - Dispatch, -} from 'react' +import React, { useState, useEffect, ReactNode, Dispatch } from 'react' import { useClient } from 'cozy-client' import classNames from 'classnames' import { useDispatch } from 'react-redux' @@ -62,11 +56,13 @@ import { ProfileEcogestureActionTypes, updateProfileEcogestureSuccess, } from 'store/profileEcogesture/profileEcogesture.actions' +import { InitSteps, InitStepsErrors } from 'models/initialisationSteps.model' +import log from 'utils/logger' +import SplashScreen from './SplashScreen' +import SplashScreenError from './SplashScreenError' interface SplashRootProps { fadeTimer?: number - splashComponent: ComponentType - splashErrorComponent: ComponentType children: ReactNode } @@ -74,18 +70,17 @@ interface SplashRootProps { * Added splash screen if data is not ready * @param params {{ fadeTimer, splashComponent, children }} */ -const SplashRoot = ({ - fadeTimer = 1000, - splashComponent: SplashComponent, - splashErrorComponent: SplashErrorComponent, - children, -}: SplashRootProps) => { +const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => { const client = useClient() const [{ splashEnd, splashStart }, setState] = useState({ splashEnd: false, splashStart: false, }) - const [error, setError] = useState<Error | any>(null) + + const [initStep, setinitStep] = useState<InitSteps>(InitSteps.MIGRATION) + const [initStepErrors, setinitStepErrors] = useState<InitStepsErrors | null>( + null + ) const dispatch: Dispatch< | ChallengeActionTypes | ChartActionTypes @@ -110,11 +105,20 @@ const SplashRoot = ({ useEffect(() => { let subscribed = true async function loadData() { - const initializationService = new InitializationService(client) - const partnersInfoService = new PartnersInfoService(client) - const ms = new MigrationService(client) - const migrationsResult: ReleaseNotes = await ms.runMigrations(migrations) + const initializationService = new InitializationService( + client, + setinitStep, + setinitStepErrors + ) + const partnersInfoService = new PartnersInfoService( + client, + setinitStepErrors + ) + const ms = new MigrationService(client, setinitStepErrors) try { + const migrationsResult: ReleaseNotes = await ms.runMigrations( + migrations + ) // Init index await initializationService.initIndex() @@ -127,6 +131,9 @@ const SplashRoot = ({ const termsStatus: TermsStatus = await initializationService.initConsent() if (subscribed) dispatch(updateTermValidation(termsStatus)) + // Init fluidPrices + await initializationService.initFluidPrices() + // Init profile and update ecogestures, challenges, analysis const profile = await initializationService.initProfile() const profileType = await initializationService.initProfileType() @@ -135,7 +142,6 @@ const SplashRoot = ({ setValidExploration(UserExplorationID.EXPLORATION007) const [ ecogestureHash, - fluidPricesHash, duelHash, quizHash, challengeHash, @@ -143,7 +149,6 @@ const SplashRoot = ({ analysisResult, ] = await Promise.all([ initializationService.initEcogesture(profile.ecogestureHash), - initializationService.initFluidPrices(profile.fluidPricesHash), initializationService.initDuelEntity(profile.duelHash), initializationService.initQuizEntity(profile.quizHash), initializationService.initExplorationEntity(profile.challengeHash), @@ -151,7 +156,6 @@ const SplashRoot = ({ initializationService.initAnalysis(profile), ]) profile.ecogestureHash = ecogestureHash - profile.fluidPricesHash = fluidPricesHash profile.duelHash = duelHash profile.quizHash = quizHash profile.challengeHash = challengeHash @@ -257,10 +261,6 @@ const SplashRoot = ({ : 'desktop', }) } - setState(prev => ({ - ...prev, - splashStart: true, - })) // Check partnersInfo from backoffice const partnersInfo: PartnersInfo = await partnersInfoService.getPartnersInfo() @@ -285,6 +285,11 @@ const SplashRoot = ({ isConcernedByPartnerIssue = true } dispatch(setFluidStatus(_updatedFluidStatus)) + /* + * If the partnersIssueModal has not been seen today + * and the user is concerned by any one of the partners' issue + * enable the modal + */ if ( today !== (profile && profile.partnersIssueDate.toISO()) && isConcernedByPartnerIssue @@ -293,20 +298,25 @@ const SplashRoot = ({ } } - /* - * If the partnersIssueModal has not been seen today - * and the user is concerned by any one of the partners' issue - * enable the modal - */ + if (subscribed) { + log.info('Initialization finished successfully !') + setState(prev => ({ + ...prev, + splashStart: true, + })) + } } catch (err) { - setError(err as any) + if (err instanceof TypeError && !initStepErrors) { + setinitStepErrors(InitStepsErrors.UNKNOWN_ERROR) + } + log.error(`[Initialization] Error : ${err}`) } } - loadData() + if (!initStepErrors) loadData() return () => { subscribed = false } - }, [client, dispatch, setValidExploration]) + }, [client, dispatch, initStepErrors, setValidExploration]) return ( <> @@ -317,7 +327,11 @@ const SplashRoot = ({ ['splash-fade']: splashStart, })} > - {!error ? <SplashComponent /> : <SplashErrorComponent />} + {!initStepErrors ? ( + <SplashScreen initStep={initStep} /> + ) : ( + <SplashScreenError error={initStepErrors} /> + )} </div> )} {splashStart && children} diff --git a/src/components/Splash/SplashScreen.spec.tsx b/src/components/Splash/SplashScreen.spec.tsx index bdaf1ae4ecab8be7da5a094fa3ecac57660fe09e..3b30e82a360e521b437dbe31b56fea011ca1b871 100644 --- a/src/components/Splash/SplashScreen.spec.tsx +++ b/src/components/Splash/SplashScreen.spec.tsx @@ -1,10 +1,22 @@ import React from 'react' -import { shallow } from 'enzyme' +import { mount } from 'enzyme' import SplashScreen from './SplashScreen' +import toJson from 'enzyme-to-json' +import { InitSteps } from 'models/initialisationSteps.model' + +jest.mock('cozy-ui/transpiled/react/I18n', () => { + return { + useI18n: jest.fn(() => { + return { + t: (str: string) => str, + } + }), + } +}) describe('SplashScreen component', () => { it('should be rendered correctly', () => { - const component = shallow(<SplashScreen />).getElement() - expect(component).toMatchSnapshot() + const component = mount(<SplashScreen initStep={InitSteps.CONSENT} />) + expect(toJson(component)).toMatchSnapshot() }) }) diff --git a/src/components/Splash/SplashScreen.tsx b/src/components/Splash/SplashScreen.tsx index 44b1ba189703c769c897ccfd47d2886209f5c0c8..55b861fd7a44b610273c40e694c5f8662ccbd363 100644 --- a/src/components/Splash/SplashScreen.tsx +++ b/src/components/Splash/SplashScreen.tsx @@ -1,9 +1,11 @@ import React from 'react' import Lottie from 'react-lottie' -import logos from 'assets/png/logos.png' +import logos from 'assets/png/logos_partenaires.svg' import * as loadingData from 'assets/anims/splash.json' import './splashScreen.scss' +import { InitSteps } from 'models/initialisationSteps.model' +import { useI18n } from 'cozy-ui/transpiled/react/I18n' const loadingOptions = { loop: true, @@ -13,12 +15,36 @@ const loadingOptions = { preserveAspectRatio: 'xMidYMid slice', }, } - -const SplashScreen: React.FC = () => { +interface SplashScreenProps { + initStep: InitSteps +} +const SplashScreen: React.FC<SplashScreenProps> = ({ + initStep, +}: SplashScreenProps) => { + const { t } = useI18n() + const getProgress = () => { + const total: number = Object.values(InitSteps).length / 2 + const progress: number = + initStep === 0 ? 10 : Math.round((initStep / total) * 100) + return progress + } return ( <> <div className="splash-content"> - <Lottie options={loadingOptions} height={300} width={300} /> + <div className="splash-loader"> + <Lottie options={loadingOptions} height={200} width={200} /> + <div className="splash-progress"> + <div className="splash-progress-bar-container"> + <div + className="splash-progress-bar-content" + style={{ width: `${getProgress()}%` }} + ></div> + </div> + </div> + </div> + <div className="step-label text-18-normal"> + {t(`splashscreen.step.${initStep}`)} + </div> <div className="splash-logos-container"> <img src={logos} alt="ensemble de logos" /> </div> diff --git a/src/components/Splash/SplashScreenError.spec.tsx b/src/components/Splash/SplashScreenError.spec.tsx index e21e522114c0a8cf43aed13bfd00791846456d71..0ea4a279188aa94cf44f7550406d762d17ad9b5a 100644 --- a/src/components/Splash/SplashScreenError.spec.tsx +++ b/src/components/Splash/SplashScreenError.spec.tsx @@ -1,7 +1,9 @@ import React from 'react' -import { shallow } from 'enzyme' +import { mount } from 'enzyme' import SplashScreenError from './SplashScreenError' import Button from '@material-ui/core/Button' +import { InitStepsErrors } from 'models/initialisationSteps.model' +import toJson from 'enzyme-to-json' jest.mock('cozy-ui/transpiled/react/I18n', () => { return { @@ -26,11 +28,15 @@ describe('SplashScreenError component', () => { window.location.reload = reload }) it('should be rendered correctly', () => { - const component = shallow(<SplashScreenError />).getElement() - expect(component).toMatchSnapshot() + const component = mount( + <SplashScreenError error={InitStepsErrors.CONSENT_ERROR} /> + ) + expect(toJson(component)).toMatchSnapshot() }) it('should reload the page', () => { - const component = shallow(<SplashScreenError />) + const component = mount( + <SplashScreenError error={InitStepsErrors.CONSENT_ERROR} /> + ) component .find(Button) .first() diff --git a/src/components/Splash/SplashScreenError.tsx b/src/components/Splash/SplashScreenError.tsx index 26c8e0678a374d737aac727e850c13958a2b94d1..1f888197abeabc912b4bd41e435e9d18f8a9205d 100644 --- a/src/components/Splash/SplashScreenError.tsx +++ b/src/components/Splash/SplashScreenError.tsx @@ -2,10 +2,9 @@ import React from 'react' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import Lottie from 'react-lottie' import Button from '@material-ui/core/Button' -import logos from 'assets/png/logos.png' - import * as loadingData from 'assets/anims/splash.json' import './splashScreen.scss' +import { InitStepsErrors } from 'models/initialisationSteps.model' const loadingOptions = { loop: false, @@ -15,21 +14,27 @@ const loadingOptions = { preserveAspectRatio: 'xMidYMid slice', }, } - -const SplashScreenError: React.FC = () => { +interface SplashScreenErrorProps { + error: InitStepsErrors +} +const SplashScreenError: React.FC<SplashScreenErrorProps> = ({ + error, +}: SplashScreenErrorProps) => { const { t } = useI18n() return ( <> <div className="splash-content"> - <Lottie options={loadingOptions} height={300} width={300} /> - <div className="splash-logos-container"> - <img src={logos} alt="ensemble de logos" /> + <div className="splash-loader"> + <Lottie options={loadingOptions} height={200} width={200} /> + <div className="splash-error-text text-20-bold"> + {t('splashscreen.error_loading')} + </div> + <div className="splash-error-text text-18-normal"> + {t(`splashscreen.${error}`)} + </div> </div> </div> <div className="splash-footer"> - <div className="splash-footer-error-text text-16-normal"> - {t('splashscreen.error_loading')} - </div> <Button aria-label={t('splashscreen.accessibility.button_reload')} className="splash-footer-button" diff --git a/src/components/Splash/__snapshots__/SplashRoot.spec.tsx.snap b/src/components/Splash/__snapshots__/SplashRoot.spec.tsx.snap index 12fe7c8878fd3b102646c650133b52bf6c3611a8..cc8029032259ae786424aab72473e829c45eec6c 100644 --- a/src/components/Splash/__snapshots__/SplashRoot.spec.tsx.snap +++ b/src/components/Splash/__snapshots__/SplashRoot.spec.tsx.snap @@ -1,16 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`SplashRoot component should be rendered correctly 1`] = ` -<React.Fragment> - <div - className="splash-root" - style={ - Object { - "transitionDuration": "1s", - } - } - > - <SplashScreen /> - </div> -</React.Fragment> -`; +exports[`SplashRoot component should be rendered correctly 1`] = `undefined`; diff --git a/src/components/Splash/__snapshots__/SplashScreen.spec.tsx.snap b/src/components/Splash/__snapshots__/SplashScreen.spec.tsx.snap index e3a7b52b0fb5109218496e037c447d3853e77d0a..c5d82298b76eda4ad9cf7d80ee6242af13279989 100644 --- a/src/components/Splash/__snapshots__/SplashScreen.spec.tsx.snap +++ b/src/components/Splash/__snapshots__/SplashScreen.spec.tsx.snap @@ -1,2219 +1,1418 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`SplashScreen component should be rendered correctly 1`] = ` -<React.Fragment> +<SplashScreen + initStep={1} +> <div className="splash-content" > - <Lottie - ariaLabel="animation" - ariaRole="button" - eventListeners={Array []} - height={300} - isClickToPauseDisabled={false} - isPaused={false} - isStopped={false} - options={ - Object { - "animationData": Object { - "assets": Array [ - Object { - "e": 1, - "h": 250, - "id": "image_0", - "p": "data:image/png;base64,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", - "u": "", - "w": 250, - }, - Object { - "e": 1, - "h": 250, - "id": "image_1", - "p": "data:image/png;base64,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", - "u": "", - "w": 250, - }, - Object { - "id": "comp_0", - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, + <div + className="splash-loader" + > + <Lottie + ariaLabel="animation" + ariaRole="button" + eventListeners={Array []} + height={200} + isClickToPauseDisabled={false} + isPaused={false} + isStopped={false} + options={ + Object { + "animationData": Object { + "__complete": true, + "assets": Array [ + Object { + "e": 1, + "h": 250, + "id": "image_0", + "p": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAIaElEQVR4Xu3VsZEdVRRF0fdJgBBQGkgGEAGEoBAgA8hAIUAEEIKskUsIkIEw5ehTJQuLUZWezpnXd8me+qd73d5wW/4RIHB5gdvl39ALEiCwhO4jIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ848ud6xfub9e2H336/3t5erD8/147f/XQBoX+64ahfuL9Zz9Z9/bjWernW+vI/L//3WuvVerd+vX233o5COeBlhX7AkZ7SI94f1l9rra/+55l+uz3/8B8B/56QgNCf0DGe+qPcH9YPa63fH3nOf9a79cz/1Z/WNYX+tO7xpJ/m/rD+WGt9/xEP+dPt+Xr1EX/nT0ICQg9BX2Hm/rBer7W+efRd7uuX24v186N/5w9iAkKPUZ8/JPRzbyj0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JPf36yX6/169ujwF+v17ev1+tG/8wcxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGewL9Mt+j7O/D7zgAAAABJRU5ErkJggg==", + "u": "", + "w": 250, + }, + Object { + "e": 1, + "h": 250, + "id": "image_1", + "p": "data:image/png;base64,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", + "u": "", + "w": 250, + }, + Object { + "id": "comp_0", + "layers": Array [ + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 130, + 0, + ], + "t": 0, + "ti": null, + "to": null, }, - "s": Array [ - -5, - 130, - 0, - ], - "t": 0, - "ti": Array [ - 0, - 0, - 0, - ], - "to": Array [ - 0, - -5.167, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 99, + 0, + ], + "t": 12, + "ti": null, + "to": null, }, - "o": Object { - "x": 0.167, - "y": 0.167, + Object { + "s": Array [ + -5, + 130, + 0, + ], + "t": 24, }, - "s": Array [ - -5, - 99, - 0, - ], - "t": 12, - "ti": Array [ - 0, - -5.167, - 0, - ], - "to": Array [ - 0, - 0, - 0, - ], - }, - Object { - "s": Array [ - -5, - 130, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "ddd": 0, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 111.918, + 0, + ], + "t": 0, + "ti": null, + "to": null, }, - "s": Array [ - 25, - 111.918, - 0, - ], - "t": 0, - "ti": Array [ - 0, - -3.833, - 0, - ], - "to": Array [ - 0, - -2.153, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 99, - 0, - ], - "t": 6, - "ti": Array [ - 0, - 0, - 0, - ], - "to": Array [ - 0, - 3.151, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 130, - 0, - ], - "t": 18, - "ti": Array [ - 0, - 7.793, - 0, - ], - "to": Array [ - 0, - 0, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 114.5, - 0, - ], - "t": 24, - "ti": Array [ - 0, - 1.911, - 0, - ], - "to": Array [ - 0, - -6.763, - 0, - ], - }, - Object { - "s": Array [ - 40.75, - 99, - 0, - ], - "t": 30, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 99, + 0, + ], + "t": 6, + "ti": null, + "to": null, }, - "o": Object { - "x": 0.167, - "y": 0.167, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 130, + 0, + ], + "t": 18, + "ti": null, + "to": null, }, - "s": Array [ - 55, - 99, - 0, - ], - "t": 0, - "ti": Array [ - 0, - 0, - 0, - ], - "to": Array [ - 0, - 5.167, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 114.5, + 0, + ], + "t": 24, + "ti": Array [ + 0, + 1.911, + 0, + ], + "to": Array [ + 0, + -6.763, + 0, + ], }, - "o": Object { - "x": 0.167, - "y": 0.167, + Object { + "s": Array [ + 40.75, + 99, + 0, + ], + "t": 30, }, - "s": Array [ - 55, - 130, - 0, - ], - "t": 12, - "ti": Array [ - 0, - 5.167, - 0, - ], - "to": Array [ - 0, - 0, - 0, - ], - }, - Object { - "s": Array [ - 55, - 99, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - }, - ], - "chars": Array [ - Object { - "ch": "E", - "data": Object { - "shapes": Array [ Object { + "ao": 0, "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 3, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 99, + 0, ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 130, + 0, ], - "v": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + 55, + 99, + 0, ], + "t": 24, }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "E", - "ty": "sh", + ], }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "E", - "np": 3, - "ty": "gr", + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, ], }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 58.1, - }, - Object { - "ch": "c", - "data": Object { - "shapes": Array [ - Object { - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 2.733, - 1.15, - ], - Array [ - 3.533, - 0, - ], - Array [ - 2.966, - -1.3, - ], - Array [ - 2.016, - -2.316, - ], - Array [ - 1.05, - -3.2, - ], - Array [ - 0, - -3.766, - ], - Array [ - -1.15, - -3.233, - ], - Array [ - -2, - -2.216, - ], - Array [ - -2.717, - -1.166, - ], - Array [ - -3.167, - 0, - ], - Array [ - -3.3, - 1.25, - ], - Array [ - -2.2, - 2.7, - ], - Array [ - 0, - 0, - ], - Array [ - 0.766, - 0, - ], - Array [ - 0.6, - -0.516, - ], - Array [ - 0.933, - -0.633, - ], - Array [ - 1.4, - -0.516, - ], - Array [ - 2.166, - 0, - ], - Array [ - 1.816, - 0.85, - ], - Array [ - 1.266, - 1.617, - ], - Array [ - 0.7, - 2.384, - ], - Array [ - 0, - 3.067, - ], - Array [ - -0.65, - 2.367, - ], - Array [ - -1.284, - 1.667, + ], + "chars": Array [ + Object { + "ch": "E", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 8.7, + -71.65, + ], + Array [ + 8.7, + 0, + ], + Array [ + 52.85, + 0, + ], + Array [ + 52.85, + -7.9, + ], + Array [ + 18.45, + -7.9, + ], + Array [ + 18.45, + -32.35, + ], + Array [ + 46.3, + -32.35, + ], + Array [ + 46.3, + -39.95, + ], + Array [ + 18.45, + -39.95, + ], + Array [ + 18.45, + -63.75, + ], + Array [ + 52.85, + -63.75, + ], + Array [ + 52.85, + -71.65, + ], ], - Array [ - -1.9, - 0.884, - ], - Array [ - -2.467, - 0, - ], - Array [ - -1.284, - -0.416, - ], - Array [ - -0.9, - -0.5, - ], - Array [ - -0.584, - -0.416, - ], - Array [ - -0.5, - 0, - ], - Array [ - -0.267, - 0.2, - ], - Array [ - -0.267, - 0.367, - ], - ], - "o": Array [ - Array [ - -2.1, - -2.1, - ], - Array [ - -2.734, - -1.15, - ], - Array [ - -3.834, - 0, - ], - Array [ - -2.967, - 1.3, - ], - Array [ - -2.017, - 2.317, - ], - Array [ - -1.05, - 3.2, - ], - Array [ - 0, - 4.134, - ], - Array [ - 1.15, - 3.234, - ], - Array [ - 2, - 2.217, - ], - Array [ - 2.716, - 1.166, - ], - Array [ - 3.666, - 0, - ], - Array [ - 3.3, - -1.25, - ], - Array [ - 0, - 0, - ], - Array [ - -0.367, - -0.566, - ], - Array [ - -0.6, - 0, - ], - Array [ - -0.6, - 0.517, - ], - Array [ - -0.934, - 0.634, - ], - Array [ - -1.4, - 0.517, - ], - Array [ - -2.267, - 0, - ], - Array [ - -1.817, - -0.85, - ], - Array [ - -1.267, - -1.616, - ], - Array [ - -0.7, - -2.383, - ], - Array [ - 0, - -2.933, - ], - Array [ - 0.65, - -2.366, - ], - Array [ - 1.283, - -1.666, - ], - Array [ - 1.9, - -0.883, - ], - Array [ - 1.866, - 0, - ], - Array [ - 1.283, - 0.417, - ], - Array [ - 0.9, - 0.5, - ], - Array [ - 0.583, - 0.417, - ], - Array [ - 0.5, - 0, - ], - Array [ - 0.266, - -0.2, - ], - Array [ - 0, - 0, - ], - ], - "v": Array [ - Array [ - 44.2, - -44.85, - ], - Array [ - 36.95, - -49.725, - ], - Array [ - 27.55, - -51.45, - ], - Array [ - 17.35, - -49.5, - ], - Array [ - 9.875, - -44.075, - ], - Array [ - 5.275, - -35.8, - ], - Array [ - 3.7, - -25.35, - ], - Array [ - 5.425, - -14.3, - ], - Array [ - 10.15, - -6.125, - ], - Array [ - 17.225, - -1.05, - ], - Array [ - 26.05, - 0.7, - ], - Array [ - 36.5, - -1.175, - ], - Array [ - 44.75, - -7.1, - ], - Array [ - 42.25, - -10.35, - ], - Array [ - 40.55, - -11.2, - ], - Array [ - 38.75, - -10.425, - ], - Array [ - 36.45, - -8.7, - ], - Array [ - 32.95, - -6.975, - ], - Array [ - 27.6, - -6.2, - ], - Array [ - 21.475, - -7.475, - ], - Array [ - 16.85, - -11.175, - ], - Array [ - 13.9, - -17.175, - ], - Array [ - 12.85, - -25.35, - ], - Array [ - 13.825, - -33.3, - ], - Array [ - 16.725, - -39.35, - ], - Array [ - 21.5, - -43.175, - ], - Array [ - 28.05, - -44.5, - ], - Array [ - 32.775, - -43.875, - ], - Array [ - 36.05, - -42.5, - ], - Array [ - 38.275, - -41.125, - ], - Array [ - 39.9, - -40.5, - ], - Array [ - 41.05, - -40.8, + "o": Array [ + Array [ + 8.7, + -71.65, + ], + Array [ + 8.7, + 0, + ], + Array [ + 52.85, + 0, + ], + Array [ + 52.85, + -7.9, + ], + Array [ + 18.45, + -7.9, + ], + Array [ + 18.45, + -32.35, + ], + Array [ + 46.3, + -32.35, + ], + Array [ + 46.3, + -39.95, + ], + Array [ + 18.45, + -39.95, + ], + Array [ + 18.45, + -63.75, + ], + Array [ + 52.85, + -63.75, + ], + Array [ + 52.85, + -71.65, + ], ], - Array [ - 41.85, - -41.65, + "v": Array [ + Array [ + 8.7, + -71.65, + ], + Array [ + 8.7, + 0, + ], + Array [ + 52.85, + 0, + ], + Array [ + 52.85, + -7.9, + ], + Array [ + 18.45, + -7.9, + ], + Array [ + 18.45, + -32.35, + ], + Array [ + 46.3, + -32.35, + ], + Array [ + 46.3, + -39.95, + ], + Array [ + 18.45, + -39.95, + ], + Array [ + 18.45, + -63.75, + ], + Array [ + 52.85, + -63.75, + ], + Array [ + 52.85, + -71.65, + ], ], - ], + }, }, + "mn": "ADBE Vector Shape - Group", + "nm": "E", + "ty": "sh", }, - "mn": "ADBE Vector Shape - Group", - "nm": "c", - "ty": "sh", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "c", - "np": 3, - "ty": "gr", - }, - ], + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "E", + "np": 3, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 58.1, }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 46.7, - }, - Object { - "ch": "o", - "data": Object { - "shapes": Array [ - Object { - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 2.983, - -1.233, - ], - Array [ - 2.1, - -2.266, - ], - Array [ - 1.133, - -3.216, - ], - Array [ - 0, - -3.966, - ], - Array [ - -1.134, - -3.2, - ], - Array [ - -2.1, - -2.266, - ], - Array [ - -2.984, - -1.216, - ], - Array [ - -3.7, - 0, - ], - Array [ - -2.984, - 1.216, - ], - Array [ - -2.084, - 2.267, - ], - Array [ - -1.117, - 3.2, - ], - Array [ - 0, - 4, - ], - Array [ - 1.116, - 3.217, - ], - Array [ - 2.083, - 2.267, - ], - Array [ - 2.983, - 1.234, - ], - Array [ - 3.7, - 0, - ], - ], - "o": Array [ - Array [ - -2.984, - 1.234, - ], - Array [ - -2.1, - 2.267, - ], - Array [ - -1.134, - 3.217, - ], - Array [ - 0, - 4, - ], - Array [ - 1.133, - 3.2, - ], - Array [ - 2.1, - 2.267, - ], - Array [ - 2.983, - 1.216, - ], - Array [ - 3.7, - 0, - ], - Array [ - 2.983, - -1.216, - ], - Array [ - 2.083, - -2.266, - ], - Array [ - 1.116, - -3.2, - ], - Array [ - 0, - -3.966, - ], - Array [ - -1.117, - -3.216, - ], - Array [ - -2.084, - -2.266, - ], - Array [ - -2.984, - -1.233, - ], - Array [ - -3.7, - 0, - ], - ], - "v": Array [ - Array [ - 17.775, - -49.6, - ], - Array [ - 10.15, - -44.35, - ], - Array [ - 5.3, - -36.125, - ], - Array [ - 3.6, - -25.35, - ], - Array [ - 5.3, - -14.55, - ], - Array [ - 10.15, - -6.35, - ], - Array [ - 17.775, - -1.125, - ], - Array [ - 27.8, - 0.7, - ], - Array [ - 37.825, - -1.125, - ], - Array [ - 45.425, - -6.35, - ], - Array [ - 50.225, - -14.55, - ], - Array [ - 51.9, - -25.35, - ], - Array [ - 50.225, - -36.125, - ], - Array [ - 45.425, - -44.35, - ], - Array [ - 37.825, - -49.6, - ], - Array [ - 27.8, - -51.45, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", - }, - Object { - "hd": false, - "ind": 1, - "ix": 2, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 1.866, - 0.867, - ], - Array [ - 1.25, - 1.617, - ], - Array [ - 0.616, - 2.367, - ], - Array [ - 0, - 3, - ], - Array [ - -0.617, - 2.384, - ], - Array [ - -1.25, - 1.634, - ], - Array [ - -1.867, - 0.867, - ], - Array [ - -2.534, - 0, - ], - Array [ - -2.467, - -3.366, - ], - Array [ - 0, - -6.033, - ], - Array [ - 2.466, - -3.35, - ], - Array [ - 5, - 0, - ], - ], - "o": Array [ - Array [ - -1.867, - -0.866, - ], - Array [ - -1.25, - -1.616, - ], - Array [ - -0.617, - -2.366, - ], - Array [ - 0, - -3, - ], - Array [ - 0.616, - -2.383, - ], - Array [ - 1.25, - -1.633, - ], - Array [ - 1.866, - -0.866, - ], - Array [ - 5, - 0, - ], - Array [ - 2.466, - 3.367, - ], - Array [ - 0, - 6, - ], - Array [ - -2.467, - 3.35, - ], - Array [ - -2.534, - 0, - ], - ], - "v": Array [ - Array [ - 21.2, - -7.55, - ], - Array [ - 16.525, - -11.275, - ], - Array [ - 13.725, - -17.25, - ], - Array [ - 12.8, - -25.3, - ], - Array [ - 13.725, - -33.375, - ], - Array [ - 16.525, - -39.4, - ], - Array [ - 21.2, - -43.15, - ], - Array [ - 27.8, - -44.45, - ], - Array [ - 39, - -39.4, - ], - Array [ - 42.7, - -25.3, - ], - Array [ - 39, - -11.275, + Object { + "ch": "c", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 44.2, + -44.85, + ], + Array [ + 39.683, + -48.575, + ], + Array [ + 31.083000000000002, + -51.45, + ], + Array [ + 20.316000000000003, + -50.8, + ], + Array [ + 11.891, + -46.391000000000005, + ], + Array [ + 6.325, + -39, + ], + Array [ + 3.7, + -29.116, + ], + Array [ + 4.275, + -17.533, + ], + Array [ + 8.15, + -8.341000000000001, + ], + Array [ + 14.508000000000001, + -2.216, + ], + Array [ + 22.883000000000003, + 0.7, + ], + Array [ + 33.2, + 0.07499999999999996, + ], + Array [ + 42.55, + -4.3999999999999995, + ], + Array [ + 42.25, + -10.35, + ], + Array [ + 41.315999999999995, + -11.2, + ], + Array [ + 39.35, + -10.941, + ], + Array [ + 37.383, + -9.332999999999998, + ], + Array [ + 34.35, + -7.491, + ], + Array [ + 29.766000000000002, + -6.2, + ], + Array [ + 23.291, + -6.625, + ], + Array [ + 18.116, + -9.558, + ], + Array [ + 14.6, + -14.791, + ], + Array [ + 12.85, + -22.283, + ], + Array [ + 13.174999999999999, + -30.932999999999996, + ], + Array [ + 15.441, + -37.683, + ], + Array [ + 19.6, + -42.291, + ], + Array [ + 25.583000000000002, + -44.5, + ], + Array [ + 31.491, + -44.291, + ], + Array [ + 35.15, + -43, + ], + Array [ + 37.690999999999995, + -41.541, + ], + Array [ + 39.4, + -40.5, + ], + Array [ + 40.782999999999994, + -40.599999999999994, + ], + Array [ + 41.583, + -41.283, + ], ], - Array [ - 27.8, - -6.25, + "o": Array [ + Array [ + 42.1, + -46.95, + ], + Array [ + 34.216, + -50.875, + ], + Array [ + 23.716, + -51.45, + ], + Array [ + 14.383000000000001, + -48.2, + ], + Array [ + 7.8580000000000005, + -41.758, + ], + Array [ + 4.2250000000000005, + -32.599999999999994, + ], + Array [ + 3.7, + -21.216, + ], + Array [ + 6.574999999999999, + -11.066, + ], + Array [ + 12.15, + -3.908, + ], + Array [ + 19.941000000000003, + 0.11599999999999988, + ], + Array [ + 29.716, + 0.7, + ], + Array [ + 39.8, + -2.425, + ], + Array [ + 44.75, + -7.1, + ], + Array [ + 41.883, + -10.916, + ], + Array [ + 39.949999999999996, + -11.2, + ], + Array [ + 38.15, + -9.908000000000001, + ], + Array [ + 35.516000000000005, + -8.065999999999999, + ], + Array [ + 31.550000000000004, + -6.457999999999999, + ], + Array [ + 25.333000000000002, + -6.2, + ], + Array [ + 19.658, + -8.325, + ], + Array [ + 15.583000000000002, + -12.791, + ], + Array [ + 13.200000000000001, + -19.558, + ], + Array [ + 12.85, + -28.283, + ], + Array [ + 14.475, + -35.666, + ], + Array [ + 18.008000000000003, + -41.016, + ], + Array [ + 23.4, + -44.058, + ], + Array [ + 29.916, + -44.5, + ], + Array [ + 34.058, + -43.458, + ], + Array [ + 36.949999999999996, + -42, + ], + Array [ + 38.858, + -40.708, + ], + Array [ + 40.4, + -40.5, + ], + Array [ + 41.315999999999995, + -41, + ], + Array [ + 41.85, + -41.65, + ], ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "o", - "np": 5, - "ty": "gr", - }, - ], - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 55.6, - }, - Object { - "ch": "l", - "data": Object { - "shapes": Array [ - Object { - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "v": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, + "v": Array [ + Array [ + 44.2, + -44.85, + ], + Array [ + 36.95, + -49.725, + ], + Array [ + 27.55, + -51.45, + ], + Array [ + 17.35, + -49.5, + ], + Array [ + 9.875, + -44.075, + ], + Array [ + 5.275, + -35.8, + ], + Array [ + 3.7, + -25.35, + ], + Array [ + 5.425, + -14.3, + ], + Array [ + 10.15, + -6.125, + ], + Array [ + 17.225, + -1.05, + ], + Array [ + 26.05, + 0.7, + ], + Array [ + 36.5, + -1.175, + ], + Array [ + 44.75, + -7.1, + ], + Array [ + 42.25, + -10.35, + ], + Array [ + 40.55, + -11.2, + ], + Array [ + 38.75, + -10.425, + ], + Array [ + 36.45, + -8.7, + ], + Array [ + 32.95, + -6.975, + ], + Array [ + 27.6, + -6.2, + ], + Array [ + 21.475, + -7.475, + ], + Array [ + 16.85, + -11.175, + ], + Array [ + 13.9, + -17.175, + ], + Array [ + 12.85, + -25.35, + ], + Array [ + 13.825, + -33.3, + ], + Array [ + 16.725, + -39.35, + ], + Array [ + 21.5, + -43.175, + ], + Array [ + 28.05, + -44.5, + ], + Array [ + 32.775, + -43.875, + ], + Array [ + 36.05, + -42.5, + ], + Array [ + 38.275, + -41.125, + ], + Array [ + 39.9, + -40.5, + ], + Array [ + 41.05, + -40.8, + ], + Array [ + 41.85, + -41.65, + ], ], - ], + }, }, + "mn": "ADBE Vector Shape - Group", + "nm": "c", + "ty": "sh", }, - "mn": "ADBE Vector Shape - Group", - "nm": "l", - "ty": "sh", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "l", - "np": 3, - "ty": "gr", - }, - ], + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "c", + "np": 3, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 46.7, }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 25.6, - }, - Object { - "ch": "y", - "data": Object { - "shapes": Array [ - Object { - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0.483, - -0.35, - ], - Array [ - 0.2, - -0.533, - ], - Array [ - 0, - 0, - ], - Array [ - 0.233, - -0.733, - ], - Array [ - 0.233, - -0.766, - ], - Array [ - 0.216, - 0.734, - ], - Array [ - 0.3, - 0.734, - ], - Array [ - 0, - 0, - ], - Array [ - 0.433, - 0.384, - ], - Array [ - 0.766, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - -0.45, - 0.4, - ], - Array [ - -0.3, - 0.666, - ], - ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - -0.567, - 0, - ], - Array [ - -0.484, - 0.35, - ], - Array [ - 0, - 0, - ], - Array [ - -0.3, - 0.767, - ], - Array [ - -0.234, - 0.734, - ], - Array [ - -0.167, - -0.766, - ], - Array [ - -0.217, - -0.733, - ], - Array [ - 0, - 0, - ], - Array [ - -0.2, - -0.466, - ], - Array [ - -0.434, - -0.383, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0.933, - 0, - ], - Array [ - 0.45, - -0.4, - ], - Array [ - 0, - 0, - ], - ], - "v": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 43.3, - -50.65, - ], - Array [ - 41.725, - -50.125, - ], - Array [ - 40.7, - -48.8, - ], - Array [ - 27.55, - -16.95, - ], - Array [ - 26.75, - -14.7, - ], - Array [ - 26.05, - -12.45, - ], - Array [ - 25.475, - -14.7, - ], - Array [ - 24.7, - -16.9, - ], - Array [ - 11.15, - -48.8, - ], - Array [ - 10.2, - -50.075, - ], - Array [ - 8.4, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 18.95, - 17.15, + Object { + "ch": "o", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 20.758, + -50.833, + ], + Array [ + 12.25, + -46.616, + ], + Array [ + 6.433, + -39.341, + ], + Array [ + 3.6, + -29.316000000000003, + ], + Array [ + 4.166, + -17.75, + ], + Array [ + 8.05, + -8.616, + ], + Array [ + 14.790999999999999, + -2.341, + ], + Array [ + 24.1, + 0.7, + ], + Array [ + 34.841, + 0.09099999999999997, + ], + Array [ + 43.340999999999994, + -4.083, + ], + Array [ + 49.108000000000004, + -11.350000000000001, + ], + Array [ + 51.9, + -21.35, + ], + Array [ + 51.341, + -32.908, + ], + Array [ + 47.507999999999996, + -42.083, + ], + Array [ + 40.808, + -48.366, + ], + Array [ + 31.5, + -51.45, + ], ], - Array [ - 21.025, - 16.55, + "o": Array [ + Array [ + 14.790999999999999, + -48.366, + ], + Array [ + 8.05, + -42.083, + ], + Array [ + 4.166, + -32.908, + ], + Array [ + 3.6, + -21.35, + ], + Array [ + 6.433, + -11.350000000000001, + ], + Array [ + 12.25, + -4.083, + ], + Array [ + 20.758, + 0.09099999999999997, + ], + Array [ + 31.5, + 0.7, + ], + Array [ + 40.808, + -2.341, + ], + Array [ + 47.507999999999996, + -8.616, + ], + Array [ + 51.341, + -17.75, + ], + Array [ + 51.9, + -29.316000000000003, + ], + Array [ + 49.108000000000004, + -39.341, + ], + Array [ + 43.340999999999994, + -46.616, + ], + Array [ + 34.841, + -50.833, + ], + Array [ + 24.1, + -51.45, + ], ], - Array [ - 22.15, - 14.95, + "v": Array [ + Array [ + 17.775, + -49.6, + ], + Array [ + 10.15, + -44.35, + ], + Array [ + 5.3, + -36.125, + ], + Array [ + 3.6, + -25.35, + ], + Array [ + 5.3, + -14.55, + ], + Array [ + 10.15, + -6.35, + ], + Array [ + 17.775, + -1.125, + ], + Array [ + 27.8, + 0.7, + ], + Array [ + 37.825, + -1.125, + ], + Array [ + 45.425, + -6.35, + ], + Array [ + 50.225, + -14.55, + ], + Array [ + 51.9, + -25.35, + ], + Array [ + 50.225, + -36.125, + ], + Array [ + 45.425, + -44.35, + ], + Array [ + 37.825, + -49.6, + ], + Array [ + 27.8, + -51.45, + ], ], - ], + }, }, + "mn": "ADBE Vector Shape - Group", + "nm": "o", + "ty": "sh", }, - "mn": "ADBE Vector Shape - Group", - "nm": "y", - "ty": "sh", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "y", - "np": 3, - "ty": "gr", - }, - ], - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 51.2, - }, - ], - "ddd": 0, - "default": Object { - "assets": Array [ - Object { - "e": 1, - "h": 250, - "id": "image_0", - "p": "data:image/png;base64,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", - "u": "", - "w": 250, - }, - Object { - "e": 1, - "h": 250, - "id": "image_1", - "p": "data:image/png;base64,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", - "u": "", - "w": 250, - }, - Object { - "id": "comp_0", - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 130, - 0, - ], - "t": 0, - "ti": Array [ - 0, - 0, - 0, - ], - "to": Array [ - 0, - -5.167, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, + Object { + "hd": false, + "ind": 1, + "ix": 2, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 23.066, + -6.683, + ], + Array [ + 17.775, + -9.658000000000001, + ], + Array [ + 14.341, + -14.883, + ], + Array [ + 12.8, + -22.3, + ], + Array [ + 13.108, + -30.991, + ], + Array [ + 15.274999999999999, + -37.766, + ], + Array [ + 19.333, + -42.283, + ], + Array [ + 25.266000000000002, + -44.45, + ], + Array [ + 36.533, + -42.766, + ], + Array [ + 42.7, + -31.333000000000002, + ], + Array [ + 41.466, + -14.625, + ], + Array [ + 32.8, + -6.25, + ], + ], + "o": Array [ + Array [ + 19.333, + -8.416, + ], + Array [ + 15.274999999999999, + -12.891, + ], + Array [ + 13.108, + -19.616, + ], + Array [ + 12.8, + -28.3, + ], + Array [ + 14.341, + -35.758, + ], + Array [ + 17.775, + -41.033, + ], + Array [ + 23.066, + -44.016, + ], + Array [ + 32.8, + -44.45, + ], + Array [ + 41.466, + -36.033, + ], + Array [ + 42.7, + -19.3, + ], + Array [ + 36.533, + -7.925000000000001, + ], + Array [ + 25.266000000000002, + -6.25, + ], + ], + "v": Array [ + Array [ + 21.2, + -7.55, + ], + Array [ + 16.525, + -11.275, + ], + Array [ + 13.725, + -17.25, + ], + Array [ + 12.8, + -25.3, + ], + Array [ + 13.725, + -33.375, + ], + Array [ + 16.525, + -39.4, + ], + Array [ + 21.2, + -43.15, + ], + Array [ + 27.8, + -44.45, + ], + Array [ + 39, + -39.4, + ], + Array [ + 42.7, + -25.3, + ], + Array [ + 39, + -11.275, + ], + Array [ + 27.8, + -6.25, + ], + ], }, - "s": Array [ - -5, - 99, - 0, - ], - "t": 12, - "ti": Array [ - 0, - -5.167, - 0, - ], - "to": Array [ - 0, - 0, - 0, - ], - }, - Object { - "s": Array [ - -5, - 130, - 0, - ], - "t": 24, }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, + "mn": "ADBE Vector Shape - Group", + "nm": "o", + "ty": "sh", + }, + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "o", + "np": 5, + "ty": "gr", }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "ddd": 0, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 111.918, - 0, - ], - "t": 0, - "ti": Array [ - 0, - -3.833, - 0, - ], - "to": Array [ - 0, - -2.153, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 99, - 0, - ], - "t": 6, - "ti": Array [ - 0, - 0, - 0, - ], - "to": Array [ - 0, - 3.151, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 130, - 0, - ], - "t": 18, - "ti": Array [ - 0, - 7.793, - 0, - ], - "to": Array [ - 0, - 0, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 114.5, - 0, - ], - "t": 24, - "ti": Array [ - 0, - 1.911, - 0, - ], - "to": Array [ - 0, - -6.763, - 0, - ], - }, - Object { - "s": Array [ - 40.75, - 99, - 0, - ], - "t": 30, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 99, - 0, - ], - "t": 0, - "ti": Array [ - 0, - 0, - 0, - ], - "to": Array [ - 0, - 5.167, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 130, - 0, - ], - "t": 12, - "ti": Array [ - 0, - 5.167, - 0, - ], - "to": Array [ - 0, - 0, - 0, - ], - }, - Object { - "s": Array [ - 55, - 99, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 55.6, }, - ], - "chars": Array [ Object { - "ch": "E", + "ch": "l", "data": Object { "shapes": Array [ Object { @@ -2229,167 +1428,72 @@ exports[`SplashScreen component should be rendered correctly 1`] = ` "a": 0, "ix": 2, "k": Object { + "__converted": true, "c": true, "i": Array [ Array [ - 0, - 0, + 8.3, + -73.65, ], Array [ - 0, + 8.3, 0, ], Array [ - 0, + 17.2, 0, ], Array [ - 0, - 0, + 17.2, + -73.65, ], + ], + "o": Array [ Array [ - 0, - 0, + 8.3, + -73.65, ], Array [ - 0, + 8.3, 0, ], Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, + 17.2, 0, ], Array [ - 0, - 0, + 17.2, + -73.65, ], ], "v": Array [ Array [ - 8.7, - -71.65, + 8.3, + -73.65, ], Array [ - 8.7, + 8.3, 0, ], Array [ - 52.85, + 17.2, 0, ], Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, + 17.2, + -73.65, ], ], }, }, "mn": "ADBE Vector Shape - Group", - "nm": "E", + "nm": "l", "ty": "sh", }, ], "ix": 1, "mn": "ADBE Vector Group", - "nm": "E", + "nm": "l", "np": 3, "ty": "gr", }, @@ -2398,10 +1502,10 @@ exports[`SplashScreen component should be rendered correctly 1`] = ` "fFamily": "Lato", "size": 77, "style": "Regular", - "w": 58.1, + "w": 25.6, }, Object { - "ch": "c", + "ch": "y", "data": Object { "shapes": Array [ Object { @@ -2417,419 +1521,240 @@ exports[`SplashScreen component should be rendered correctly 1`] = ` "a": 0, "ix": 2, "k": Object { + "__converted": true, "c": true, "i": Array [ Array [ - 0, - 0, - ], - Array [ - 2.733, - 1.15, - ], - Array [ - 3.533, - 0, - ], - Array [ - 2.966, - -1.3, - ], - Array [ - 2.016, - -2.316, - ], - Array [ - 1.05, - -3.2, - ], - Array [ - 0, - -3.766, - ], - Array [ - -1.15, - -3.233, - ], - Array [ - -2, - -2.216, - ], - Array [ - -2.717, - -1.166, + 50.4, + -50.65, ], Array [ - -3.167, - 0, + 43.3, + -50.65, ], Array [ - -3.3, - 1.25, + 42.208, + -50.475, ], Array [ - -2.2, - 2.7, + 40.900000000000006, + -49.333, ], Array [ - 0, - 0, + 27.55, + -16.95, ], Array [ - 0.766, - 0, + 26.983, + -15.433, ], Array [ - 0.6, - -0.516, + 26.283, + -13.216, ], Array [ - 0.933, - -0.633, + 25.691000000000003, + -13.966, ], Array [ - 1.4, - -0.516, + 25, + -16.165999999999997, ], Array [ - 2.166, - 0, + 11.15, + -48.8, ], Array [ - 1.816, - 0.85, + 10.633, + -49.691, ], Array [ - 1.266, - 1.617, + 9.166, + -50.65, ], Array [ 0.7, - 2.384, - ], - Array [ - 0, - 3.067, - ], - Array [ - -0.65, - 2.367, - ], - Array [ - -1.284, - 1.667, - ], - Array [ - -1.9, - 0.884, - ], - Array [ - -2.467, - 0, - ], - Array [ - -1.284, - -0.416, + -50.65, ], Array [ - -0.9, - -0.5, + 21.6, + -2.95, ], Array [ - -0.584, - -0.416, + 12.35, + 17.15, ], Array [ - -0.5, - 0, + 18.95, + 17.15, ], Array [ - -0.267, - 0.2, + 20.575, + 16.95, ], Array [ - -0.267, - 0.367, + 21.849999999999998, + 15.616, ], ], "o": Array [ Array [ - -2.1, - -2.1, + 50.4, + -50.65, ], Array [ - -2.734, - -1.15, + 42.733, + -50.65, ], Array [ - -3.834, - 0, + 41.241, + -49.775, ], Array [ - -2.967, - 1.3, + 40.7, + -48.8, ], Array [ - -2.017, - 2.317, + 27.25, + -16.183, ], Array [ - -1.05, - 3.2, + 26.516, + -13.966, ], Array [ - 0, - 4.134, + 25.883, + -13.216, ], Array [ - 1.15, - 3.234, + 25.258000000000003, + -15.433, ], Array [ - 2, - 2.217, + 24.7, + -16.9, ], Array [ - 2.716, - 1.166, + 10.950000000000001, + -49.266, ], Array [ - 3.666, - 0, + 9.766, + -50.458000000000006, ], Array [ - 3.3, - -1.25, + 8.4, + -50.65, ], Array [ - 0, - 0, + 0.7, + -50.65, ], Array [ - -0.367, - -0.566, + 21.6, + -2.95, ], Array [ - -0.6, - 0, + 12.35, + 17.15, ], Array [ - -0.6, - 0.517, + 19.883, + 17.15, ], Array [ - -0.934, - 0.634, + 21.474999999999998, + 16.150000000000002, ], Array [ - -1.4, - 0.517, + 22.15, + 14.95, ], + ], + "v": Array [ Array [ - -2.267, - 0, + 50.4, + -50.65, ], Array [ - -1.817, - -0.85, + 43.3, + -50.65, ], Array [ - -1.267, - -1.616, + 41.725, + -50.125, ], Array [ - -0.7, - -2.383, + 40.7, + -48.8, ], Array [ - 0, - -2.933, + 27.55, + -16.95, ], Array [ - 0.65, - -2.366, + 26.75, + -14.7, ], Array [ - 1.283, - -1.666, + 26.05, + -12.45, ], Array [ - 1.9, - -0.883, + 25.475, + -14.7, ], Array [ - 1.866, - 0, + 24.7, + -16.9, ], Array [ - 1.283, - 0.417, + 11.15, + -48.8, ], Array [ - 0.9, - 0.5, + 10.2, + -50.075, ], Array [ - 0.583, - 0.417, + 8.4, + -50.65, ], Array [ - 0.5, - 0, + 0.7, + -50.65, ], Array [ - 0.266, - -0.2, + 21.6, + -2.95, ], Array [ - 0, - 0, + 12.35, + 17.15, ], - ], - "v": Array [ Array [ - 44.2, - -44.85, + 18.95, + 17.15, ], Array [ - 36.95, - -49.725, + 21.025, + 16.55, ], Array [ - 27.55, - -51.45, - ], - Array [ - 17.35, - -49.5, - ], - Array [ - 9.875, - -44.075, - ], - Array [ - 5.275, - -35.8, - ], - Array [ - 3.7, - -25.35, - ], - Array [ - 5.425, - -14.3, - ], - Array [ - 10.15, - -6.125, - ], - Array [ - 17.225, - -1.05, - ], - Array [ - 26.05, - 0.7, - ], - Array [ - 36.5, - -1.175, - ], - Array [ - 44.75, - -7.1, - ], - Array [ - 42.25, - -10.35, - ], - Array [ - 40.55, - -11.2, - ], - Array [ - 38.75, - -10.425, - ], - Array [ - 36.45, - -8.7, - ], - Array [ - 32.95, - -6.975, - ], - Array [ - 27.6, - -6.2, - ], - Array [ - 21.475, - -7.475, - ], - Array [ - 16.85, - -11.175, - ], - Array [ - 13.9, - -17.175, - ], - Array [ - 12.85, - -25.35, - ], - Array [ - 13.825, - -33.3, - ], - Array [ - 16.725, - -39.35, - ], - Array [ - 21.5, - -43.175, - ], - Array [ - 28.05, - -44.5, - ], - Array [ - 32.775, - -43.875, - ], - Array [ - 36.05, - -42.5, - ], - Array [ - 38.275, - -41.125, - ], - Array [ - 39.9, - -40.5, - ], - Array [ - 41.05, - -40.8, - ], - Array [ - 41.85, - -41.65, + 22.15, + 14.95, ], ], }, }, "mn": "ADBE Vector Shape - Group", - "nm": "c", + "nm": "y", "ty": "sh", }, ], "ix": 1, "mn": "ADBE Vector Group", - "nm": "c", + "nm": "y", "np": 3, "ty": "gr", }, @@ -2838,919 +1763,2895 @@ exports[`SplashScreen component should be rendered correctly 1`] = ` "fFamily": "Lato", "size": 77, "style": "Regular", - "w": 46.7, + "w": 51.2, }, - Object { - "ch": "o", - "data": Object { - "shapes": Array [ + ], + "ddd": 0, + "default": Object { + "assets": Array [ + Object { + "e": 1, + "h": 250, + "id": "image_0", + "p": "data:image/png;base64,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", + "u": "", + "w": 250, + }, + Object { + "e": 1, + "h": 250, + "id": "image_1", + "p": "data:image/png;base64,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", + "u": "", + "w": 250, + }, + Object { + "id": "comp_0", + "layers": Array [ Object { + "ao": 0, "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 2.983, - -1.233, - ], - Array [ - 2.1, - -2.266, - ], - Array [ - 1.133, - -3.216, - ], - Array [ - 0, - -3.966, - ], - Array [ - -1.134, - -3.2, - ], - Array [ - -2.1, - -2.266, - ], - Array [ - -2.984, - -1.216, - ], - Array [ - -3.7, - 0, - ], - Array [ - -2.984, - 1.216, - ], - Array [ - -2.084, - 2.267, - ], - Array [ - -1.117, - 3.2, - ], - Array [ - 0, - 4, - ], - Array [ - 1.116, - 3.217, - ], - Array [ - 2.083, - 2.267, - ], - Array [ - 2.983, - 1.234, - ], - Array [ - 3.7, - 0, - ], - ], - "o": Array [ - Array [ - -2.984, - 1.234, - ], - Array [ - -2.1, - 2.267, - ], - Array [ - -1.134, - 3.217, - ], - Array [ - 0, - 4, - ], - Array [ - 1.133, - 3.2, - ], - Array [ - 2.1, - 2.267, - ], - Array [ - 2.983, - 1.216, - ], - Array [ - 3.7, - 0, - ], - Array [ - 2.983, - -1.216, - ], - Array [ - 2.083, - -2.266, - ], - Array [ - 1.116, - -3.2, - ], - Array [ - 0, - -3.966, - ], - Array [ - -1.117, - -3.216, - ], - Array [ - -2.084, - -2.266, - ], - Array [ - -2.984, - -1.233, - ], - Array [ - -3.7, - 0, - ], - ], - "v": Array [ - Array [ - 17.775, - -49.6, - ], - Array [ - 10.15, - -44.35, - ], - Array [ - 5.3, - -36.125, - ], - Array [ - 3.6, - -25.35, - ], - Array [ - 5.3, - -14.55, - ], - Array [ - 10.15, - -6.35, - ], - Array [ - 17.775, - -1.125, - ], - Array [ - 27.8, - 0.7, - ], - Array [ - 37.825, - -1.125, - ], - Array [ - 45.425, - -6.35, - ], - Array [ - 50.225, - -14.55, - ], - Array [ - 51.9, - -25.35, - ], - Array [ - 50.225, - -36.125, - ], - Array [ - 45.425, - -44.35, - ], - Array [ - 37.825, - -49.6, - ], - Array [ - 27.8, - -51.45, - ], + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 130, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 99, + 0, + ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + -5, + 130, + 0, ], + "t": 24, }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", + ], }, - Object { - "hd": false, - "ind": 1, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, + }, + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, "ix": 2, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 1.866, - 0.867, - ], - Array [ - 1.25, - 1.617, - ], - Array [ - 0.616, - 2.367, - ], - Array [ - 0, - 3, - ], - Array [ - -0.617, - 2.384, - ], - Array [ - -1.25, - 1.634, - ], - Array [ - -1.867, - 0.867, - ], - Array [ - -2.534, - 0, - ], - Array [ - -2.467, - -3.366, - ], - Array [ - 0, - -6.033, - ], - Array [ - 2.466, - -3.35, - ], - Array [ - 5, - 0, - ], + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 111.918, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 99, + 0, + ], + "t": 6, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 130, + 0, + ], + "t": 18, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 114.5, + 0, ], - "o": Array [ - Array [ - -1.867, - -0.866, - ], - Array [ - -1.25, - -1.616, - ], - Array [ - -0.617, - -2.366, - ], - Array [ - 0, - -3, - ], - Array [ - 0.616, - -2.383, - ], - Array [ - 1.25, - -1.633, - ], - Array [ - 1.866, - -0.866, - ], - Array [ - 5, - 0, - ], - Array [ - 2.466, - 3.367, - ], - Array [ - 0, - 6, - ], - Array [ - -2.467, - 3.35, - ], - Array [ - -2.534, - 0, - ], + "t": 24, + "ti": Array [ + 0, + 1.911, + 0, ], - "v": Array [ - Array [ - 21.2, - -7.55, - ], - Array [ - 16.525, - -11.275, - ], - Array [ - 13.725, - -17.25, - ], - Array [ - 12.8, - -25.3, - ], - Array [ - 13.725, - -33.375, - ], - Array [ - 16.525, - -39.4, - ], - Array [ - 21.2, - -43.15, - ], - Array [ - 27.8, - -44.45, - ], - Array [ - 39, - -39.4, - ], - Array [ - 42.7, - -25.3, - ], - Array [ - 39, - -11.275, - ], - Array [ - 27.8, - -6.25, - ], + "to": Array [ + 0, + -6.763, + 0, ], }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", + Object { + "s": Array [ + 40.75, + 99, + 0, + ], + "t": 30, + }, + ], }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "o", - "np": 5, - "ty": "gr", + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, - ], - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 55.6, - }, - Object { - "ch": "l", - "data": Object { - "shapes": Array [ Object { + "ao": 0, "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 3, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "v": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 99, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 130, + 0, + ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + 55, + 99, + 0, ], + "t": 24, }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "l", - "ty": "sh", + ], }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "l", - "np": 3, - "ty": "gr", + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, ], }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 25.6, + ], + "chars": Array [ + Object { + "ch": "E", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 8.7, + -71.65, + ], + Array [ + 8.7, + 0, + ], + Array [ + 52.85, + 0, + ], + Array [ + 52.85, + -7.9, + ], + Array [ + 18.45, + -7.9, + ], + Array [ + 18.45, + -32.35, + ], + Array [ + 46.3, + -32.35, + ], + Array [ + 46.3, + -39.95, + ], + Array [ + 18.45, + -39.95, + ], + Array [ + 18.45, + -63.75, + ], + Array [ + 52.85, + -63.75, + ], + Array [ + 52.85, + -71.65, + ], + ], + "o": Array [ + Array [ + 8.7, + -71.65, + ], + Array [ + 8.7, + 0, + ], + Array [ + 52.85, + 0, + ], + Array [ + 52.85, + -7.9, + ], + Array [ + 18.45, + -7.9, + ], + Array [ + 18.45, + -32.35, + ], + Array [ + 46.3, + -32.35, + ], + Array [ + 46.3, + -39.95, + ], + Array [ + 18.45, + -39.95, + ], + Array [ + 18.45, + -63.75, + ], + Array [ + 52.85, + -63.75, + ], + Array [ + 52.85, + -71.65, + ], + ], + "v": Array [ + Array [ + 8.7, + -71.65, + ], + Array [ + 8.7, + 0, + ], + Array [ + 52.85, + 0, + ], + Array [ + 52.85, + -7.9, + ], + Array [ + 18.45, + -7.9, + ], + Array [ + 18.45, + -32.35, + ], + Array [ + 46.3, + -32.35, + ], + Array [ + 46.3, + -39.95, + ], + Array [ + 18.45, + -39.95, + ], + Array [ + 18.45, + -63.75, + ], + Array [ + 52.85, + -63.75, + ], + Array [ + 52.85, + -71.65, + ], + ], + }, + }, + "mn": "ADBE Vector Shape - Group", + "nm": "E", + "ty": "sh", + }, + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "E", + "np": 3, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 58.1, + }, + Object { + "ch": "c", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 44.2, + -44.85, + ], + Array [ + 39.683, + -48.575, + ], + Array [ + 31.083000000000002, + -51.45, + ], + Array [ + 20.316000000000003, + -50.8, + ], + Array [ + 11.891, + -46.391000000000005, + ], + Array [ + 6.325, + -39, + ], + Array [ + 3.7, + -29.116, + ], + Array [ + 4.275, + -17.533, + ], + Array [ + 8.15, + -8.341000000000001, + ], + Array [ + 14.508000000000001, + -2.216, + ], + Array [ + 22.883000000000003, + 0.7, + ], + Array [ + 33.2, + 0.07499999999999996, + ], + Array [ + 42.55, + -4.3999999999999995, + ], + Array [ + 42.25, + -10.35, + ], + Array [ + 41.315999999999995, + -11.2, + ], + Array [ + 39.35, + -10.941, + ], + Array [ + 37.383, + -9.332999999999998, + ], + Array [ + 34.35, + -7.491, + ], + Array [ + 29.766000000000002, + -6.2, + ], + Array [ + 23.291, + -6.625, + ], + Array [ + 18.116, + -9.558, + ], + Array [ + 14.6, + -14.791, + ], + Array [ + 12.85, + -22.283, + ], + Array [ + 13.174999999999999, + -30.932999999999996, + ], + Array [ + 15.441, + -37.683, + ], + Array [ + 19.6, + -42.291, + ], + Array [ + 25.583000000000002, + -44.5, + ], + Array [ + 31.491, + -44.291, + ], + Array [ + 35.15, + -43, + ], + Array [ + 37.690999999999995, + -41.541, + ], + Array [ + 39.4, + -40.5, + ], + Array [ + 40.782999999999994, + -40.599999999999994, + ], + Array [ + 41.583, + -41.283, + ], + ], + "o": Array [ + Array [ + 42.1, + -46.95, + ], + Array [ + 34.216, + -50.875, + ], + Array [ + 23.716, + -51.45, + ], + Array [ + 14.383000000000001, + -48.2, + ], + Array [ + 7.8580000000000005, + -41.758, + ], + Array [ + 4.2250000000000005, + -32.599999999999994, + ], + Array [ + 3.7, + -21.216, + ], + Array [ + 6.574999999999999, + -11.066, + ], + Array [ + 12.15, + -3.908, + ], + Array [ + 19.941000000000003, + 0.11599999999999988, + ], + Array [ + 29.716, + 0.7, + ], + Array [ + 39.8, + -2.425, + ], + Array [ + 44.75, + -7.1, + ], + Array [ + 41.883, + -10.916, + ], + Array [ + 39.949999999999996, + -11.2, + ], + Array [ + 38.15, + -9.908000000000001, + ], + Array [ + 35.516000000000005, + -8.065999999999999, + ], + Array [ + 31.550000000000004, + -6.457999999999999, + ], + Array [ + 25.333000000000002, + -6.2, + ], + Array [ + 19.658, + -8.325, + ], + Array [ + 15.583000000000002, + -12.791, + ], + Array [ + 13.200000000000001, + -19.558, + ], + Array [ + 12.85, + -28.283, + ], + Array [ + 14.475, + -35.666, + ], + Array [ + 18.008000000000003, + -41.016, + ], + Array [ + 23.4, + -44.058, + ], + Array [ + 29.916, + -44.5, + ], + Array [ + 34.058, + -43.458, + ], + Array [ + 36.949999999999996, + -42, + ], + Array [ + 38.858, + -40.708, + ], + Array [ + 40.4, + -40.5, + ], + Array [ + 41.315999999999995, + -41, + ], + Array [ + 41.85, + -41.65, + ], + ], + "v": Array [ + Array [ + 44.2, + -44.85, + ], + Array [ + 36.95, + -49.725, + ], + Array [ + 27.55, + -51.45, + ], + Array [ + 17.35, + -49.5, + ], + Array [ + 9.875, + -44.075, + ], + Array [ + 5.275, + -35.8, + ], + Array [ + 3.7, + -25.35, + ], + Array [ + 5.425, + -14.3, + ], + Array [ + 10.15, + -6.125, + ], + Array [ + 17.225, + -1.05, + ], + Array [ + 26.05, + 0.7, + ], + Array [ + 36.5, + -1.175, + ], + Array [ + 44.75, + -7.1, + ], + Array [ + 42.25, + -10.35, + ], + Array [ + 40.55, + -11.2, + ], + Array [ + 38.75, + -10.425, + ], + Array [ + 36.45, + -8.7, + ], + Array [ + 32.95, + -6.975, + ], + Array [ + 27.6, + -6.2, + ], + Array [ + 21.475, + -7.475, + ], + Array [ + 16.85, + -11.175, + ], + Array [ + 13.9, + -17.175, + ], + Array [ + 12.85, + -25.35, + ], + Array [ + 13.825, + -33.3, + ], + Array [ + 16.725, + -39.35, + ], + Array [ + 21.5, + -43.175, + ], + Array [ + 28.05, + -44.5, + ], + Array [ + 32.775, + -43.875, + ], + Array [ + 36.05, + -42.5, + ], + Array [ + 38.275, + -41.125, + ], + Array [ + 39.9, + -40.5, + ], + Array [ + 41.05, + -40.8, + ], + Array [ + 41.85, + -41.65, + ], + ], + }, + }, + "mn": "ADBE Vector Shape - Group", + "nm": "c", + "ty": "sh", + }, + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "c", + "np": 3, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 46.7, + }, + Object { + "ch": "o", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 20.758, + -50.833, + ], + Array [ + 12.25, + -46.616, + ], + Array [ + 6.433, + -39.341, + ], + Array [ + 3.6, + -29.316000000000003, + ], + Array [ + 4.166, + -17.75, + ], + Array [ + 8.05, + -8.616, + ], + Array [ + 14.790999999999999, + -2.341, + ], + Array [ + 24.1, + 0.7, + ], + Array [ + 34.841, + 0.09099999999999997, + ], + Array [ + 43.340999999999994, + -4.083, + ], + Array [ + 49.108000000000004, + -11.350000000000001, + ], + Array [ + 51.9, + -21.35, + ], + Array [ + 51.341, + -32.908, + ], + Array [ + 47.507999999999996, + -42.083, + ], + Array [ + 40.808, + -48.366, + ], + Array [ + 31.5, + -51.45, + ], + ], + "o": Array [ + Array [ + 14.790999999999999, + -48.366, + ], + Array [ + 8.05, + -42.083, + ], + Array [ + 4.166, + -32.908, + ], + Array [ + 3.6, + -21.35, + ], + Array [ + 6.433, + -11.350000000000001, + ], + Array [ + 12.25, + -4.083, + ], + Array [ + 20.758, + 0.09099999999999997, + ], + Array [ + 31.5, + 0.7, + ], + Array [ + 40.808, + -2.341, + ], + Array [ + 47.507999999999996, + -8.616, + ], + Array [ + 51.341, + -17.75, + ], + Array [ + 51.9, + -29.316000000000003, + ], + Array [ + 49.108000000000004, + -39.341, + ], + Array [ + 43.340999999999994, + -46.616, + ], + Array [ + 34.841, + -50.833, + ], + Array [ + 24.1, + -51.45, + ], + ], + "v": Array [ + Array [ + 17.775, + -49.6, + ], + Array [ + 10.15, + -44.35, + ], + Array [ + 5.3, + -36.125, + ], + Array [ + 3.6, + -25.35, + ], + Array [ + 5.3, + -14.55, + ], + Array [ + 10.15, + -6.35, + ], + Array [ + 17.775, + -1.125, + ], + Array [ + 27.8, + 0.7, + ], + Array [ + 37.825, + -1.125, + ], + Array [ + 45.425, + -6.35, + ], + Array [ + 50.225, + -14.55, + ], + Array [ + 51.9, + -25.35, + ], + Array [ + 50.225, + -36.125, + ], + Array [ + 45.425, + -44.35, + ], + Array [ + 37.825, + -49.6, + ], + Array [ + 27.8, + -51.45, + ], + ], + }, + }, + "mn": "ADBE Vector Shape - Group", + "nm": "o", + "ty": "sh", + }, + Object { + "hd": false, + "ind": 1, + "ix": 2, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 23.066, + -6.683, + ], + Array [ + 17.775, + -9.658000000000001, + ], + Array [ + 14.341, + -14.883, + ], + Array [ + 12.8, + -22.3, + ], + Array [ + 13.108, + -30.991, + ], + Array [ + 15.274999999999999, + -37.766, + ], + Array [ + 19.333, + -42.283, + ], + Array [ + 25.266000000000002, + -44.45, + ], + Array [ + 36.533, + -42.766, + ], + Array [ + 42.7, + -31.333000000000002, + ], + Array [ + 41.466, + -14.625, + ], + Array [ + 32.8, + -6.25, + ], + ], + "o": Array [ + Array [ + 19.333, + -8.416, + ], + Array [ + 15.274999999999999, + -12.891, + ], + Array [ + 13.108, + -19.616, + ], + Array [ + 12.8, + -28.3, + ], + Array [ + 14.341, + -35.758, + ], + Array [ + 17.775, + -41.033, + ], + Array [ + 23.066, + -44.016, + ], + Array [ + 32.8, + -44.45, + ], + Array [ + 41.466, + -36.033, + ], + Array [ + 42.7, + -19.3, + ], + Array [ + 36.533, + -7.925000000000001, + ], + Array [ + 25.266000000000002, + -6.25, + ], + ], + "v": Array [ + Array [ + 21.2, + -7.55, + ], + Array [ + 16.525, + -11.275, + ], + Array [ + 13.725, + -17.25, + ], + Array [ + 12.8, + -25.3, + ], + Array [ + 13.725, + -33.375, + ], + Array [ + 16.525, + -39.4, + ], + Array [ + 21.2, + -43.15, + ], + Array [ + 27.8, + -44.45, + ], + Array [ + 39, + -39.4, + ], + Array [ + 42.7, + -25.3, + ], + Array [ + 39, + -11.275, + ], + Array [ + 27.8, + -6.25, + ], + ], + }, + }, + "mn": "ADBE Vector Shape - Group", + "nm": "o", + "ty": "sh", + }, + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "o", + "np": 5, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 55.6, + }, + Object { + "ch": "l", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 8.3, + -73.65, + ], + Array [ + 8.3, + 0, + ], + Array [ + 17.2, + 0, + ], + Array [ + 17.2, + -73.65, + ], + ], + "o": Array [ + Array [ + 8.3, + -73.65, + ], + Array [ + 8.3, + 0, + ], + Array [ + 17.2, + 0, + ], + Array [ + 17.2, + -73.65, + ], + ], + "v": Array [ + Array [ + 8.3, + -73.65, + ], + Array [ + 8.3, + 0, + ], + Array [ + 17.2, + 0, + ], + Array [ + 17.2, + -73.65, + ], + ], + }, + }, + "mn": "ADBE Vector Shape - Group", + "nm": "l", + "ty": "sh", + }, + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "l", + "np": 3, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 25.6, + }, + Object { + "ch": "y", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 50.4, + -50.65, + ], + Array [ + 43.3, + -50.65, + ], + Array [ + 42.208, + -50.475, + ], + Array [ + 40.900000000000006, + -49.333, + ], + Array [ + 27.55, + -16.95, + ], + Array [ + 26.983, + -15.433, + ], + Array [ + 26.283, + -13.216, + ], + Array [ + 25.691000000000003, + -13.966, + ], + Array [ + 25, + -16.165999999999997, + ], + Array [ + 11.15, + -48.8, + ], + Array [ + 10.633, + -49.691, + ], + Array [ + 9.166, + -50.65, + ], + Array [ + 0.7, + -50.65, + ], + Array [ + 21.6, + -2.95, + ], + Array [ + 12.35, + 17.15, + ], + Array [ + 18.95, + 17.15, + ], + Array [ + 20.575, + 16.95, + ], + Array [ + 21.849999999999998, + 15.616, + ], + ], + "o": Array [ + Array [ + 50.4, + -50.65, + ], + Array [ + 42.733, + -50.65, + ], + Array [ + 41.241, + -49.775, + ], + Array [ + 40.7, + -48.8, + ], + Array [ + 27.25, + -16.183, + ], + Array [ + 26.516, + -13.966, + ], + Array [ + 25.883, + -13.216, + ], + Array [ + 25.258000000000003, + -15.433, + ], + Array [ + 24.7, + -16.9, + ], + Array [ + 10.950000000000001, + -49.266, + ], + Array [ + 9.766, + -50.458000000000006, + ], + Array [ + 8.4, + -50.65, + ], + Array [ + 0.7, + -50.65, + ], + Array [ + 21.6, + -2.95, + ], + Array [ + 12.35, + 17.15, + ], + Array [ + 19.883, + 17.15, + ], + Array [ + 21.474999999999998, + 16.150000000000002, + ], + Array [ + 22.15, + 14.95, + ], + ], + "v": Array [ + Array [ + 50.4, + -50.65, + ], + Array [ + 43.3, + -50.65, + ], + Array [ + 41.725, + -50.125, + ], + Array [ + 40.7, + -48.8, + ], + Array [ + 27.55, + -16.95, + ], + Array [ + 26.75, + -14.7, + ], + Array [ + 26.05, + -12.45, + ], + Array [ + 25.475, + -14.7, + ], + Array [ + 24.7, + -16.9, + ], + Array [ + 11.15, + -48.8, + ], + Array [ + 10.2, + -50.075, + ], + Array [ + 8.4, + -50.65, + ], + Array [ + 0.7, + -50.65, + ], + Array [ + 21.6, + -2.95, + ], + Array [ + 12.35, + 17.15, + ], + Array [ + 18.95, + 17.15, + ], + Array [ + 21.025, + 16.55, + ], + Array [ + 22.15, + 14.95, + ], + ], + }, + }, + "mn": "ADBE Vector Shape - Group", + "nm": "y", + "ty": "sh", + }, + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "y", + "np": 3, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 51.2, + }, + ], + "ddd": 0, + "fonts": Object { + "list": Array [ + Object { + "ascent": 73.699951171875, + "fFamily": "Lato", + "fName": "Lato-Regular", + "fStyle": "Regular", + }, + ], }, - Object { - "ch": "y", - "data": Object { - "shapes": Array [ - Object { - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ + "fr": 25, + "h": 500, + "ip": 0, + "layers": Array [ + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 0, + 0, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 254, + 417.75, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "nm": "Ecolyo", + "op": 13, + "singleShape": true, + "sr": 1, + "st": 0, + "t": Object { + "a": Array [], + "d": Object { + "k": Array [ Object { - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0.483, - -0.35, - ], - Array [ - 0.2, - -0.533, - ], - Array [ - 0, - 0, - ], - Array [ - 0.233, - -0.733, - ], - Array [ - 0.233, - -0.766, - ], - Array [ - 0.216, - 0.734, - ], - Array [ - 0.3, - 0.734, - ], - Array [ - 0, - 0, - ], - Array [ - 0.433, - 0.384, - ], - Array [ - 0.766, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - -0.45, - 0.4, - ], - Array [ - -0.3, - 0.666, - ], + "s": Object { + "f": "Lato-Regular", + "fc": Array [ + 0.922, + 0.922, + 0.922, + ], + "j": 2, + "lh": 92.4, + "ls": 0, + "ps": Array [ + -255.5, + -56.25, + ], + "s": 77, + "sz": Array [ + 501, + 112.5, + ], + "t": "Ecolyo", + "tr": 0, + }, + "t": 0, + }, + ], + }, + "m": Object { + "a": Object { + "a": 0, + "ix": 2, + "k": Array [ + 0, + 0, + ], + }, + "g": 1, + }, + "p": Object {}, + }, + "ty": 5, + }, + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "h": 140, + "hasMask": true, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 60, + 70, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 256, + 224.5, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "layers": Array [ + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 130, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 99, + 0, + ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + -5, + 130, + 0, ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - -0.567, - 0, - ], - Array [ - -0.484, - 0.35, - ], - Array [ - 0, - 0, - ], - Array [ - -0.3, - 0.767, - ], - Array [ - -0.234, - 0.734, - ], - Array [ - -0.167, - -0.766, - ], - Array [ - -0.217, - -0.733, - ], - Array [ - 0, - 0, - ], - Array [ - -0.2, - -0.466, - ], - Array [ - -0.434, - -0.383, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0.933, - 0, - ], - Array [ - 0.45, - -0.4, - ], - Array [ - 0, - 0, - ], + "t": 24, + }, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, + }, + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 111.918, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 99, + 0, + ], + "t": 6, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 130, + 0, + ], + "t": 18, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 114.5, + 0, ], - "v": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 43.3, - -50.65, - ], - Array [ - 41.725, - -50.125, - ], - Array [ - 40.7, - -48.8, - ], - Array [ - 27.55, - -16.95, - ], - Array [ - 26.75, - -14.7, - ], - Array [ - 26.05, - -12.45, - ], - Array [ - 25.475, - -14.7, - ], - Array [ - 24.7, - -16.9, - ], - Array [ - 11.15, - -48.8, - ], - Array [ - 10.2, - -50.075, - ], - Array [ - 8.4, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 18.95, - 17.15, - ], - Array [ - 21.025, - 16.55, - ], - Array [ - 22.15, - 14.95, - ], + "t": 24, + "ti": Array [ + 0, + 1.911, + 0, + ], + "to": Array [ + 0, + -6.763, + 0, + ], + }, + Object { + "s": Array [ + 40.75, + 99, + 0, ], + "t": 30, + }, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, + }, + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 3, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 99, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 130, + 0, + ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + 55, + 99, + 0, + ], + "t": 24, + }, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, + }, + ], + "masksProperties": Array [ + Object { + "inv": false, + "mode": "a", + "nm": "Masque 1", + "o": Object { + "a": 0, + "ix": 3, + "k": 100, + }, + "pt": Object { + "a": 0, + "ix": 1, + "k": Object { + "c": true, + "i": Array [ + Array [ + 139.039, + -41, + ], + Array [ + -18, + -41, + ], + Array [ + -18, + 85.184, + ], + Array [ + 139.039, + 85.184, + ], + ], + "o": Array [ + Array [ + 139.039, + -41, + ], + Array [ + -18, + -41, + ], + Array [ + -18, + 85.184, + ], + Array [ + 139.039, + 85.184, + ], + ], + "v": Array [ + Array [ + 139.039, + -41, + ], + Array [ + -18, + -41, + ], + Array [ + -18, + 85.184, + ], + Array [ + 139.039, + 85.184, + ], + ], + }, + }, + "x": Object { + "a": 0, + "ix": 4, + "k": 0, + }, + }, + ], + "nm": "compo barre", + "op": 13.2, + "refId": "comp_0", + "sr": 0.55, + "st": 0, + "ty": 0, + "w": 120, + }, + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "ind": 3, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 250, + 250, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "bouclier", + "op": 13, + "refId": "image_1", + "sr": 1, + "st": 0, + "ty": 2, + }, + ], + "markers": Array [], + "meta": Object { + "a": "", + "d": "", + "g": "LottieFiles AE 0.1.20", + "k": "", + "tc": "", + }, + "nm": "splash illu", + "op": 13, + "v": "5.5.7", + "w": 500, + }, + "fonts": Object { + "list": Array [ + Object { + "ascent": 73.699951171875, + "fFamily": "Lato", + "fName": "Lato-Regular", + "fStyle": "Regular", + }, + ], + }, + "fr": 25, + "h": 500, + "ip": 0, + "layers": Array [ + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 0, + 0, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 254, + 417.75, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "nm": "Ecolyo", + "op": 13, + "singleShape": true, + "sr": 1, + "st": 0, + "t": Object { + "a": Array [], + "d": Object { + "k": Array [ + Object { + "s": Object { + "f": "Lato-Regular", + "fc": Array [ + 0.922, + 0.922, + 0.922, + ], + "j": 2, + "lh": 92.4, + "ls": 0, + "ps": Array [ + -255.5, + -56.25, + ], + "s": 77, + "sz": Array [ + 501, + 112.5, + ], + "t": "Ecolyo", + "tr": 0, + }, + "t": 0, + }, + ], + }, + "m": Object { + "a": Object { + "a": 0, + "ix": 2, + "k": Array [ + 0, + 0, + ], + }, + "g": 1, + }, + "p": Object {}, + }, + "ty": 5, + }, + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "h": 140, + "hasMask": true, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 60, + 70, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 256, + 224.5, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "layers": Array [ + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 130, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 99, + 0, + ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + -5, + 130, + 0, + ], + "t": 24, + }, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, + }, + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 111.918, + 0, + ], + "t": 0, + "ti": null, + "to": null, }, - "mn": "ADBE Vector Shape - Group", - "nm": "y", - "ty": "sh", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "y", - "np": 3, - "ty": "gr", + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 99, + 0, + ], + "t": 6, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 130, + 0, + ], + "t": 18, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 114.5, + 0, + ], + "t": 24, + "ti": Array [ + 0, + 1.911, + 0, + ], + "to": Array [ + 0, + -6.763, + 0, + ], + }, + Object { + "s": Array [ + 40.75, + 99, + 0, + ], + "t": 30, + }, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, }, - ], - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 51.2, - }, - ], - "ddd": 0, - "fonts": Object { - "list": Array [ - Object { - "ascent": 73.699951171875, - "fFamily": "Lato", - "fName": "Lato-Regular", - "fStyle": "Regular", - }, - ], - }, - "fr": 25, - "h": 500, - "ip": 0, - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 0, - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 254, - 417.75, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, - }, - "nm": "Ecolyo", - "op": 13, - "sr": 1, - "st": 0, - "t": Object { - "a": Array [], - "d": Object { - "k": Array [ - Object { - "s": Object { - "f": "Lato-Regular", - "fc": Array [ - 0.922, - 0.922, - 0.922, - ], - "j": 2, - "lh": 92.4, - "ls": 0, - "ps": Array [ - -255.5, - -56.25, - ], - "s": 77, - "sz": Array [ - 501, - 112.5, - ], - "t": "Ecolyo", - "tr": 0, - }, - "t": 0, + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 3, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 99, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 130, + 0, + ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + 55, + 99, + 0, + ], + "t": 24, + }, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], }, - ], - }, - "m": Object { - "a": Object { - "a": 0, - "ix": 2, - "k": Array [ - 0, - 0, - ], }, - "g": 1, - }, - "p": Object {}, - }, - "ty": 5, - }, - Object { - "ao": 0, - "bm": 0, - "ddd": 0, - "h": 140, - "hasMask": true, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 60, - 70, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 256, - 224.5, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, - }, + ], "masksProperties": Array [ Object { "inv": false, @@ -3768,38 +4669,38 @@ exports[`SplashScreen component should be rendered correctly 1`] = ` "c": true, "i": Array [ Array [ - 0, - 0, + 139.039, + -41, ], Array [ - 0, - 0, + -18, + -41, ], Array [ - 0, - 0, + -18, + 85.184, ], Array [ - 0, - 0, + 139.039, + 85.184, ], ], "o": Array [ Array [ - 0, - 0, + 139.039, + -41, ], Array [ - 0, - 0, + -18, + -41, ], Array [ - 0, - 0, + -18, + 85.184, ], Array [ - 0, - 0, + 139.039, + 85.184, ], ], "v": Array [ @@ -3840,6 +4741,7 @@ exports[`SplashScreen component should be rendered correctly 1`] = ` Object { "ao": 0, "bm": 0, + "completed": true, "ddd": 0, "ind": 3, "ip": 0, @@ -3903,325 +4805,56 @@ exports[`SplashScreen component should be rendered correctly 1`] = ` "v": "5.5.7", "w": 500, }, - "fonts": Object { - "list": Array [ - Object { - "ascent": 73.699951171875, - "fFamily": "Lato", - "fName": "Lato-Regular", - "fStyle": "Regular", - }, - ], - }, - "fr": 25, - "h": 500, - "ip": 0, - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 0, - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 254, - 417.75, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], - }, - }, - "nm": "Ecolyo", - "op": 13, - "sr": 1, - "st": 0, - "t": Object { - "a": Array [], - "d": Object { - "k": Array [ - Object { - "s": Object { - "f": "Lato-Regular", - "fc": Array [ - 0.922, - 0.922, - 0.922, - ], - "j": 2, - "lh": 92.4, - "ls": 0, - "ps": Array [ - -255.5, - -56.25, - ], - "s": 77, - "sz": Array [ - 501, - 112.5, - ], - "t": "Ecolyo", - "tr": 0, - }, - "t": 0, - }, - ], - }, - "m": Object { - "a": Object { - "a": 0, - "ix": 2, - "k": Array [ - 0, - 0, - ], - }, - "g": 1, - }, - "p": Object {}, - }, - "ty": 5, - }, - Object { - "ao": 0, - "bm": 0, - "ddd": 0, - "h": 140, - "hasMask": true, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 60, - 70, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 256, - 224.5, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], - }, - }, - "masksProperties": Array [ - Object { - "inv": false, - "mode": "a", - "nm": "Masque 1", - "o": Object { - "a": 0, - "ix": 3, - "k": 100, - }, - "pt": Object { - "a": 0, - "ix": 1, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "v": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - }, - }, - "x": Object { - "a": 0, - "ix": 4, - "k": 0, - }, - }, - ], - "nm": "compo barre", - "op": 13.2, - "refId": "comp_0", - "sr": 0.55, - "st": 0, - "ty": 0, - "w": 120, - }, - Object { - "ao": 0, - "bm": 0, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 250, - 250, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "bouclier", - "op": 13, - "refId": "image_1", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - "markers": Array [], - "meta": Object { - "a": "", - "d": "", - "g": "LottieFiles AE 0.1.20", - "k": "", - "tc": "", + "autoplay": true, + "loop": true, + "rendererSettings": Object { + "preserveAspectRatio": "xMidYMid slice", }, - "nm": "splash illu", - "op": 13, - "v": "5.5.7", - "w": 500, - }, - "autoplay": true, - "loop": true, - "rendererSettings": Object { - "preserveAspectRatio": "xMidYMid slice", - }, + } } - } - speed={1} - title="" - width={300} - /> + speed={1} + title="" + width={200} + > + <div + aria-label="animation" + onClick={[Function]} + role="button" + style={ + Object { + "height": "200px", + "margin": "0 auto", + "outline": "none", + "overflow": "hidden", + "width": "200px", + } + } + tabIndex="0" + title="" + /> + </Lottie> + <div + className="splash-progress" + > + <div + className="splash-progress-bar-container" + > + <div + className="splash-progress-bar-content" + style={ + Object { + "width": "14%", + } + } + /> + </div> + </div> + </div> + <div + className="step-label text-18-normal" + > + splashscreen.step.1 + </div> <div className="splash-logos-container" > @@ -4231,5 +4864,5 @@ exports[`SplashScreen component should be rendered correctly 1`] = ` /> </div> </div> -</React.Fragment> +</SplashScreen> `; diff --git a/src/components/Splash/__snapshots__/SplashScreenError.spec.tsx.snap b/src/components/Splash/__snapshots__/SplashScreenError.spec.tsx.snap index 739fb981fc3e8914e8b0bec5eb515c838b64443e..f3bb2e47e2f09690cf2f11013288c95f86eb59be 100644 --- a/src/components/Splash/__snapshots__/SplashScreenError.spec.tsx.snap +++ b/src/components/Splash/__snapshots__/SplashScreenError.spec.tsx.snap @@ -1,2219 +1,1418 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`SplashScreenError component should be rendered correctly 1`] = ` -<React.Fragment> +<SplashScreenError + error="consent_error" +> <div className="splash-content" > - <Lottie - ariaLabel="animation" - ariaRole="button" - eventListeners={Array []} - height={300} - isClickToPauseDisabled={false} - isPaused={false} - isStopped={false} - options={ - Object { - "animationData": Object { - "assets": Array [ - Object { - "e": 1, - "h": 250, - "id": "image_0", - "p": "data:image/png;base64,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", - "u": "", - "w": 250, - }, - Object { - "e": 1, - "h": 250, - "id": "image_1", - "p": "data:image/png;base64,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", - "u": "", - "w": 250, - }, - Object { - "id": "comp_0", - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, + <div + className="splash-loader" + > + <Lottie + ariaLabel="animation" + ariaRole="button" + eventListeners={Array []} + height={200} + isClickToPauseDisabled={false} + isPaused={false} + isStopped={false} + options={ + Object { + "animationData": Object { + "__complete": true, + "assets": Array [ + Object { + "e": 1, + "h": 250, + "id": "image_0", + "p": "data:image/png;base64,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", + "u": "", + "w": 250, + }, + Object { + "e": 1, + "h": 250, + "id": "image_1", + "p": "data:image/png;base64,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", + "u": "", + "w": 250, + }, + Object { + "id": "comp_0", + "layers": Array [ + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 130, + 0, + ], + "t": 0, + "ti": null, + "to": null, }, - "s": Array [ - -5, - 130, - 0, - ], - "t": 0, - "ti": Array [ - 0, - 0, - 0, - ], - "to": Array [ - 0, - -5.167, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 99, + 0, + ], + "t": 12, + "ti": null, + "to": null, }, - "o": Object { - "x": 0.167, - "y": 0.167, + Object { + "s": Array [ + -5, + 130, + 0, + ], + "t": 24, }, - "s": Array [ - -5, - 99, - 0, - ], - "t": 12, - "ti": Array [ - 0, - -5.167, - 0, - ], - "to": Array [ - 0, - 0, - 0, - ], - }, - Object { - "s": Array [ - -5, - 130, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "ddd": 0, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 111.918, + 0, + ], + "t": 0, + "ti": null, + "to": null, }, - "s": Array [ - 25, - 111.918, - 0, - ], - "t": 0, - "ti": Array [ - 0, - -3.833, - 0, - ], - "to": Array [ - 0, - -2.153, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 99, - 0, - ], - "t": 6, - "ti": Array [ - 0, - 0, - 0, - ], - "to": Array [ - 0, - 3.151, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 130, - 0, - ], - "t": 18, - "ti": Array [ - 0, - 7.793, - 0, - ], - "to": Array [ - 0, - 0, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 114.5, - 0, - ], - "t": 24, - "ti": Array [ - 0, - 1.911, - 0, - ], - "to": Array [ - 0, - -6.763, - 0, - ], - }, - Object { - "s": Array [ - 40.75, - 99, - 0, - ], - "t": 30, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 99, + 0, + ], + "t": 6, + "ti": null, + "to": null, }, - "o": Object { - "x": 0.167, - "y": 0.167, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 130, + 0, + ], + "t": 18, + "ti": null, + "to": null, }, - "s": Array [ - 55, - 99, - 0, - ], - "t": 0, - "ti": Array [ - 0, - 0, - 0, - ], - "to": Array [ - 0, - 5.167, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 114.5, + 0, + ], + "t": 24, + "ti": Array [ + 0, + 1.911, + 0, + ], + "to": Array [ + 0, + -6.763, + 0, + ], }, - "o": Object { - "x": 0.167, - "y": 0.167, + Object { + "s": Array [ + 40.75, + 99, + 0, + ], + "t": 30, }, - "s": Array [ - 55, - 130, - 0, - ], - "t": 12, - "ti": Array [ - 0, - 5.167, - 0, - ], - "to": Array [ - 0, - 0, - 0, - ], - }, - Object { - "s": Array [ - 55, - 99, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - }, - ], - "chars": Array [ - Object { - "ch": "E", - "data": Object { - "shapes": Array [ Object { + "ao": 0, "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 3, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 99, + 0, ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 130, + 0, ], - "v": Array [ - Array [ - 8.7, - -71.65, - ], - Array [ - 8.7, - 0, - ], - Array [ - 52.85, - 0, - ], - Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, - ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + 55, + 99, + 0, ], + "t": 24, }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "E", - "ty": "sh", + ], }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "E", - "np": 3, - "ty": "gr", + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, ], }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 58.1, - }, - Object { - "ch": "c", - "data": Object { - "shapes": Array [ - Object { - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 2.733, - 1.15, - ], - Array [ - 3.533, - 0, - ], - Array [ - 2.966, - -1.3, - ], - Array [ - 2.016, - -2.316, - ], - Array [ - 1.05, - -3.2, - ], - Array [ - 0, - -3.766, - ], - Array [ - -1.15, - -3.233, - ], - Array [ - -2, - -2.216, - ], - Array [ - -2.717, - -1.166, - ], - Array [ - -3.167, - 0, - ], - Array [ - -3.3, - 1.25, - ], - Array [ - -2.2, - 2.7, - ], - Array [ - 0, - 0, - ], - Array [ - 0.766, - 0, - ], - Array [ - 0.6, - -0.516, - ], - Array [ - 0.933, - -0.633, - ], - Array [ - 1.4, - -0.516, - ], - Array [ - 2.166, - 0, - ], - Array [ - 1.816, - 0.85, - ], - Array [ - 1.266, - 1.617, - ], - Array [ - 0.7, - 2.384, - ], - Array [ - 0, - 3.067, - ], - Array [ - -0.65, - 2.367, + ], + "chars": Array [ + Object { + "ch": "E", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 8.7, + -71.65, + ], + Array [ + 8.7, + 0, + ], + Array [ + 52.85, + 0, + ], + Array [ + 52.85, + -7.9, + ], + Array [ + 18.45, + -7.9, + ], + Array [ + 18.45, + -32.35, + ], + Array [ + 46.3, + -32.35, + ], + Array [ + 46.3, + -39.95, + ], + Array [ + 18.45, + -39.95, + ], + Array [ + 18.45, + -63.75, + ], + Array [ + 52.85, + -63.75, + ], + Array [ + 52.85, + -71.65, + ], ], - Array [ - -1.284, - 1.667, - ], - Array [ - -1.9, - 0.884, - ], - Array [ - -2.467, - 0, - ], - Array [ - -1.284, - -0.416, - ], - Array [ - -0.9, - -0.5, - ], - Array [ - -0.584, - -0.416, - ], - Array [ - -0.5, - 0, - ], - Array [ - -0.267, - 0.2, - ], - Array [ - -0.267, - 0.367, - ], - ], - "o": Array [ - Array [ - -2.1, - -2.1, - ], - Array [ - -2.734, - -1.15, - ], - Array [ - -3.834, - 0, - ], - Array [ - -2.967, - 1.3, - ], - Array [ - -2.017, - 2.317, - ], - Array [ - -1.05, - 3.2, - ], - Array [ - 0, - 4.134, - ], - Array [ - 1.15, - 3.234, - ], - Array [ - 2, - 2.217, - ], - Array [ - 2.716, - 1.166, - ], - Array [ - 3.666, - 0, - ], - Array [ - 3.3, - -1.25, - ], - Array [ - 0, - 0, - ], - Array [ - -0.367, - -0.566, - ], - Array [ - -0.6, - 0, - ], - Array [ - -0.6, - 0.517, - ], - Array [ - -0.934, - 0.634, - ], - Array [ - -1.4, - 0.517, - ], - Array [ - -2.267, - 0, - ], - Array [ - -1.817, - -0.85, - ], - Array [ - -1.267, - -1.616, - ], - Array [ - -0.7, - -2.383, - ], - Array [ - 0, - -2.933, - ], - Array [ - 0.65, - -2.366, - ], - Array [ - 1.283, - -1.666, - ], - Array [ - 1.9, - -0.883, - ], - Array [ - 1.866, - 0, - ], - Array [ - 1.283, - 0.417, - ], - Array [ - 0.9, - 0.5, - ], - Array [ - 0.583, - 0.417, - ], - Array [ - 0.5, - 0, - ], - Array [ - 0.266, - -0.2, - ], - Array [ - 0, - 0, - ], - ], - "v": Array [ - Array [ - 44.2, - -44.85, - ], - Array [ - 36.95, - -49.725, - ], - Array [ - 27.55, - -51.45, - ], - Array [ - 17.35, - -49.5, - ], - Array [ - 9.875, - -44.075, - ], - Array [ - 5.275, - -35.8, - ], - Array [ - 3.7, - -25.35, - ], - Array [ - 5.425, - -14.3, - ], - Array [ - 10.15, - -6.125, - ], - Array [ - 17.225, - -1.05, - ], - Array [ - 26.05, - 0.7, - ], - Array [ - 36.5, - -1.175, - ], - Array [ - 44.75, - -7.1, - ], - Array [ - 42.25, - -10.35, - ], - Array [ - 40.55, - -11.2, - ], - Array [ - 38.75, - -10.425, - ], - Array [ - 36.45, - -8.7, - ], - Array [ - 32.95, - -6.975, - ], - Array [ - 27.6, - -6.2, - ], - Array [ - 21.475, - -7.475, - ], - Array [ - 16.85, - -11.175, - ], - Array [ - 13.9, - -17.175, - ], - Array [ - 12.85, - -25.35, - ], - Array [ - 13.825, - -33.3, - ], - Array [ - 16.725, - -39.35, - ], - Array [ - 21.5, - -43.175, - ], - Array [ - 28.05, - -44.5, - ], - Array [ - 32.775, - -43.875, - ], - Array [ - 36.05, - -42.5, - ], - Array [ - 38.275, - -41.125, - ], - Array [ - 39.9, - -40.5, - ], - Array [ - 41.05, - -40.8, + "o": Array [ + Array [ + 8.7, + -71.65, + ], + Array [ + 8.7, + 0, + ], + Array [ + 52.85, + 0, + ], + Array [ + 52.85, + -7.9, + ], + Array [ + 18.45, + -7.9, + ], + Array [ + 18.45, + -32.35, + ], + Array [ + 46.3, + -32.35, + ], + Array [ + 46.3, + -39.95, + ], + Array [ + 18.45, + -39.95, + ], + Array [ + 18.45, + -63.75, + ], + Array [ + 52.85, + -63.75, + ], + Array [ + 52.85, + -71.65, + ], ], - Array [ - 41.85, - -41.65, + "v": Array [ + Array [ + 8.7, + -71.65, + ], + Array [ + 8.7, + 0, + ], + Array [ + 52.85, + 0, + ], + Array [ + 52.85, + -7.9, + ], + Array [ + 18.45, + -7.9, + ], + Array [ + 18.45, + -32.35, + ], + Array [ + 46.3, + -32.35, + ], + Array [ + 46.3, + -39.95, + ], + Array [ + 18.45, + -39.95, + ], + Array [ + 18.45, + -63.75, + ], + Array [ + 52.85, + -63.75, + ], + Array [ + 52.85, + -71.65, + ], ], - ], + }, }, + "mn": "ADBE Vector Shape - Group", + "nm": "E", + "ty": "sh", }, - "mn": "ADBE Vector Shape - Group", - "nm": "c", - "ty": "sh", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "c", - "np": 3, - "ty": "gr", - }, - ], + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "E", + "np": 3, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 58.1, }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 46.7, - }, - Object { - "ch": "o", - "data": Object { - "shapes": Array [ - Object { - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 2.983, - -1.233, - ], - Array [ - 2.1, - -2.266, - ], - Array [ - 1.133, - -3.216, - ], - Array [ - 0, - -3.966, - ], - Array [ - -1.134, - -3.2, - ], - Array [ - -2.1, - -2.266, - ], - Array [ - -2.984, - -1.216, - ], - Array [ - -3.7, - 0, - ], - Array [ - -2.984, - 1.216, - ], - Array [ - -2.084, - 2.267, - ], - Array [ - -1.117, - 3.2, - ], - Array [ - 0, - 4, - ], - Array [ - 1.116, - 3.217, - ], - Array [ - 2.083, - 2.267, - ], - Array [ - 2.983, - 1.234, - ], - Array [ - 3.7, - 0, - ], - ], - "o": Array [ - Array [ - -2.984, - 1.234, - ], - Array [ - -2.1, - 2.267, - ], - Array [ - -1.134, - 3.217, - ], - Array [ - 0, - 4, - ], - Array [ - 1.133, - 3.2, - ], - Array [ - 2.1, - 2.267, - ], - Array [ - 2.983, - 1.216, - ], - Array [ - 3.7, - 0, - ], - Array [ - 2.983, - -1.216, - ], - Array [ - 2.083, - -2.266, - ], - Array [ - 1.116, - -3.2, - ], - Array [ - 0, - -3.966, - ], - Array [ - -1.117, - -3.216, - ], - Array [ - -2.084, - -2.266, - ], - Array [ - -2.984, - -1.233, - ], - Array [ - -3.7, - 0, - ], - ], - "v": Array [ - Array [ - 17.775, - -49.6, - ], - Array [ - 10.15, - -44.35, - ], - Array [ - 5.3, - -36.125, - ], - Array [ - 3.6, - -25.35, - ], - Array [ - 5.3, - -14.55, - ], - Array [ - 10.15, - -6.35, - ], - Array [ - 17.775, - -1.125, - ], - Array [ - 27.8, - 0.7, - ], - Array [ - 37.825, - -1.125, - ], - Array [ - 45.425, - -6.35, - ], - Array [ - 50.225, - -14.55, - ], - Array [ - 51.9, - -25.35, - ], - Array [ - 50.225, - -36.125, - ], - Array [ - 45.425, - -44.35, - ], - Array [ - 37.825, - -49.6, - ], - Array [ - 27.8, - -51.45, - ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", - }, - Object { - "hd": false, - "ind": 1, - "ix": 2, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 1.866, - 0.867, - ], - Array [ - 1.25, - 1.617, - ], - Array [ - 0.616, - 2.367, - ], - Array [ - 0, - 3, - ], - Array [ - -0.617, - 2.384, - ], - Array [ - -1.25, - 1.634, - ], - Array [ - -1.867, - 0.867, - ], - Array [ - -2.534, - 0, - ], - Array [ - -2.467, - -3.366, - ], - Array [ - 0, - -6.033, - ], - Array [ - 2.466, - -3.35, - ], - Array [ - 5, - 0, - ], - ], - "o": Array [ - Array [ - -1.867, - -0.866, - ], - Array [ - -1.25, - -1.616, - ], - Array [ - -0.617, - -2.366, - ], - Array [ - 0, - -3, - ], - Array [ - 0.616, - -2.383, - ], - Array [ - 1.25, - -1.633, - ], - Array [ - 1.866, - -0.866, - ], - Array [ - 5, - 0, - ], - Array [ - 2.466, - 3.367, - ], - Array [ - 0, - 6, - ], - Array [ - -2.467, - 3.35, - ], - Array [ - -2.534, - 0, - ], - ], - "v": Array [ - Array [ - 21.2, - -7.55, - ], - Array [ - 16.525, - -11.275, - ], - Array [ - 13.725, - -17.25, - ], - Array [ - 12.8, - -25.3, - ], - Array [ - 13.725, - -33.375, - ], - Array [ - 16.525, - -39.4, - ], - Array [ - 21.2, - -43.15, - ], - Array [ - 27.8, - -44.45, - ], - Array [ - 39, - -39.4, - ], - Array [ - 42.7, - -25.3, - ], - Array [ - 39, - -11.275, + Object { + "ch": "c", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 44.2, + -44.85, + ], + Array [ + 39.683, + -48.575, + ], + Array [ + 31.083000000000002, + -51.45, + ], + Array [ + 20.316000000000003, + -50.8, + ], + Array [ + 11.891, + -46.391000000000005, + ], + Array [ + 6.325, + -39, + ], + Array [ + 3.7, + -29.116, + ], + Array [ + 4.275, + -17.533, + ], + Array [ + 8.15, + -8.341000000000001, + ], + Array [ + 14.508000000000001, + -2.216, + ], + Array [ + 22.883000000000003, + 0.7, + ], + Array [ + 33.2, + 0.07499999999999996, + ], + Array [ + 42.55, + -4.3999999999999995, + ], + Array [ + 42.25, + -10.35, + ], + Array [ + 41.315999999999995, + -11.2, + ], + Array [ + 39.35, + -10.941, + ], + Array [ + 37.383, + -9.332999999999998, + ], + Array [ + 34.35, + -7.491, + ], + Array [ + 29.766000000000002, + -6.2, + ], + Array [ + 23.291, + -6.625, + ], + Array [ + 18.116, + -9.558, + ], + Array [ + 14.6, + -14.791, + ], + Array [ + 12.85, + -22.283, + ], + Array [ + 13.174999999999999, + -30.932999999999996, + ], + Array [ + 15.441, + -37.683, + ], + Array [ + 19.6, + -42.291, + ], + Array [ + 25.583000000000002, + -44.5, + ], + Array [ + 31.491, + -44.291, + ], + Array [ + 35.15, + -43, + ], + Array [ + 37.690999999999995, + -41.541, + ], + Array [ + 39.4, + -40.5, + ], + Array [ + 40.782999999999994, + -40.599999999999994, + ], + Array [ + 41.583, + -41.283, + ], ], - Array [ - 27.8, - -6.25, + "o": Array [ + Array [ + 42.1, + -46.95, + ], + Array [ + 34.216, + -50.875, + ], + Array [ + 23.716, + -51.45, + ], + Array [ + 14.383000000000001, + -48.2, + ], + Array [ + 7.8580000000000005, + -41.758, + ], + Array [ + 4.2250000000000005, + -32.599999999999994, + ], + Array [ + 3.7, + -21.216, + ], + Array [ + 6.574999999999999, + -11.066, + ], + Array [ + 12.15, + -3.908, + ], + Array [ + 19.941000000000003, + 0.11599999999999988, + ], + Array [ + 29.716, + 0.7, + ], + Array [ + 39.8, + -2.425, + ], + Array [ + 44.75, + -7.1, + ], + Array [ + 41.883, + -10.916, + ], + Array [ + 39.949999999999996, + -11.2, + ], + Array [ + 38.15, + -9.908000000000001, + ], + Array [ + 35.516000000000005, + -8.065999999999999, + ], + Array [ + 31.550000000000004, + -6.457999999999999, + ], + Array [ + 25.333000000000002, + -6.2, + ], + Array [ + 19.658, + -8.325, + ], + Array [ + 15.583000000000002, + -12.791, + ], + Array [ + 13.200000000000001, + -19.558, + ], + Array [ + 12.85, + -28.283, + ], + Array [ + 14.475, + -35.666, + ], + Array [ + 18.008000000000003, + -41.016, + ], + Array [ + 23.4, + -44.058, + ], + Array [ + 29.916, + -44.5, + ], + Array [ + 34.058, + -43.458, + ], + Array [ + 36.949999999999996, + -42, + ], + Array [ + 38.858, + -40.708, + ], + Array [ + 40.4, + -40.5, + ], + Array [ + 41.315999999999995, + -41, + ], + Array [ + 41.85, + -41.65, + ], ], - ], - }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "o", - "np": 5, - "ty": "gr", - }, - ], - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 55.6, - }, - Object { - "ch": "l", - "data": Object { - "shapes": Array [ - Object { - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "v": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, + "v": Array [ + Array [ + 44.2, + -44.85, + ], + Array [ + 36.95, + -49.725, + ], + Array [ + 27.55, + -51.45, + ], + Array [ + 17.35, + -49.5, + ], + Array [ + 9.875, + -44.075, + ], + Array [ + 5.275, + -35.8, + ], + Array [ + 3.7, + -25.35, + ], + Array [ + 5.425, + -14.3, + ], + Array [ + 10.15, + -6.125, + ], + Array [ + 17.225, + -1.05, + ], + Array [ + 26.05, + 0.7, + ], + Array [ + 36.5, + -1.175, + ], + Array [ + 44.75, + -7.1, + ], + Array [ + 42.25, + -10.35, + ], + Array [ + 40.55, + -11.2, + ], + Array [ + 38.75, + -10.425, + ], + Array [ + 36.45, + -8.7, + ], + Array [ + 32.95, + -6.975, + ], + Array [ + 27.6, + -6.2, + ], + Array [ + 21.475, + -7.475, + ], + Array [ + 16.85, + -11.175, + ], + Array [ + 13.9, + -17.175, + ], + Array [ + 12.85, + -25.35, + ], + Array [ + 13.825, + -33.3, + ], + Array [ + 16.725, + -39.35, + ], + Array [ + 21.5, + -43.175, + ], + Array [ + 28.05, + -44.5, + ], + Array [ + 32.775, + -43.875, + ], + Array [ + 36.05, + -42.5, + ], + Array [ + 38.275, + -41.125, + ], + Array [ + 39.9, + -40.5, + ], + Array [ + 41.05, + -40.8, + ], + Array [ + 41.85, + -41.65, + ], ], - ], + }, }, + "mn": "ADBE Vector Shape - Group", + "nm": "c", + "ty": "sh", }, - "mn": "ADBE Vector Shape - Group", - "nm": "l", - "ty": "sh", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "l", - "np": 3, - "ty": "gr", - }, - ], + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "c", + "np": 3, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 46.7, }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 25.6, - }, - Object { - "ch": "y", - "data": Object { - "shapes": Array [ - Object { - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0.483, - -0.35, - ], - Array [ - 0.2, - -0.533, - ], - Array [ - 0, - 0, - ], - Array [ - 0.233, - -0.733, - ], - Array [ - 0.233, - -0.766, - ], - Array [ - 0.216, - 0.734, - ], - Array [ - 0.3, - 0.734, - ], - Array [ - 0, - 0, - ], - Array [ - 0.433, - 0.384, - ], - Array [ - 0.766, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - -0.45, - 0.4, - ], - Array [ - -0.3, - 0.666, - ], - ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - -0.567, - 0, - ], - Array [ - -0.484, - 0.35, - ], - Array [ - 0, - 0, - ], - Array [ - -0.3, - 0.767, - ], - Array [ - -0.234, - 0.734, - ], - Array [ - -0.167, - -0.766, - ], - Array [ - -0.217, - -0.733, - ], - Array [ - 0, - 0, - ], - Array [ - -0.2, - -0.466, - ], - Array [ - -0.434, - -0.383, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0.933, - 0, - ], - Array [ - 0.45, - -0.4, - ], - Array [ - 0, - 0, - ], - ], - "v": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 43.3, - -50.65, - ], - Array [ - 41.725, - -50.125, - ], - Array [ - 40.7, - -48.8, - ], - Array [ - 27.55, - -16.95, - ], - Array [ - 26.75, - -14.7, - ], - Array [ - 26.05, - -12.45, - ], - Array [ - 25.475, - -14.7, - ], - Array [ - 24.7, - -16.9, - ], - Array [ - 11.15, - -48.8, - ], - Array [ - 10.2, - -50.075, - ], - Array [ - 8.4, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 18.95, - 17.15, + Object { + "ch": "o", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 20.758, + -50.833, + ], + Array [ + 12.25, + -46.616, + ], + Array [ + 6.433, + -39.341, + ], + Array [ + 3.6, + -29.316000000000003, + ], + Array [ + 4.166, + -17.75, + ], + Array [ + 8.05, + -8.616, + ], + Array [ + 14.790999999999999, + -2.341, + ], + Array [ + 24.1, + 0.7, + ], + Array [ + 34.841, + 0.09099999999999997, + ], + Array [ + 43.340999999999994, + -4.083, + ], + Array [ + 49.108000000000004, + -11.350000000000001, + ], + Array [ + 51.9, + -21.35, + ], + Array [ + 51.341, + -32.908, + ], + Array [ + 47.507999999999996, + -42.083, + ], + Array [ + 40.808, + -48.366, + ], + Array [ + 31.5, + -51.45, + ], ], - Array [ - 21.025, - 16.55, + "o": Array [ + Array [ + 14.790999999999999, + -48.366, + ], + Array [ + 8.05, + -42.083, + ], + Array [ + 4.166, + -32.908, + ], + Array [ + 3.6, + -21.35, + ], + Array [ + 6.433, + -11.350000000000001, + ], + Array [ + 12.25, + -4.083, + ], + Array [ + 20.758, + 0.09099999999999997, + ], + Array [ + 31.5, + 0.7, + ], + Array [ + 40.808, + -2.341, + ], + Array [ + 47.507999999999996, + -8.616, + ], + Array [ + 51.341, + -17.75, + ], + Array [ + 51.9, + -29.316000000000003, + ], + Array [ + 49.108000000000004, + -39.341, + ], + Array [ + 43.340999999999994, + -46.616, + ], + Array [ + 34.841, + -50.833, + ], + Array [ + 24.1, + -51.45, + ], ], - Array [ - 22.15, - 14.95, + "v": Array [ + Array [ + 17.775, + -49.6, + ], + Array [ + 10.15, + -44.35, + ], + Array [ + 5.3, + -36.125, + ], + Array [ + 3.6, + -25.35, + ], + Array [ + 5.3, + -14.55, + ], + Array [ + 10.15, + -6.35, + ], + Array [ + 17.775, + -1.125, + ], + Array [ + 27.8, + 0.7, + ], + Array [ + 37.825, + -1.125, + ], + Array [ + 45.425, + -6.35, + ], + Array [ + 50.225, + -14.55, + ], + Array [ + 51.9, + -25.35, + ], + Array [ + 50.225, + -36.125, + ], + Array [ + 45.425, + -44.35, + ], + Array [ + 37.825, + -49.6, + ], + Array [ + 27.8, + -51.45, + ], ], - ], + }, }, + "mn": "ADBE Vector Shape - Group", + "nm": "o", + "ty": "sh", }, - "mn": "ADBE Vector Shape - Group", - "nm": "y", - "ty": "sh", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "y", - "np": 3, - "ty": "gr", - }, - ], - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 51.2, - }, - ], - "ddd": 0, - "default": Object { - "assets": Array [ - Object { - "e": 1, - "h": 250, - "id": "image_0", - "p": "data:image/png;base64,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", - "u": "", - "w": 250, - }, - Object { - "e": 1, - "h": 250, - "id": "image_1", - "p": "data:image/png;base64,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", - "u": "", - "w": 250, - }, - Object { - "id": "comp_0", - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - -5, - 130, - 0, - ], - "t": 0, - "ti": Array [ - 0, - 0, - 0, - ], - "to": Array [ - 0, - -5.167, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, + Object { + "hd": false, + "ind": 1, + "ix": 2, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 23.066, + -6.683, + ], + Array [ + 17.775, + -9.658000000000001, + ], + Array [ + 14.341, + -14.883, + ], + Array [ + 12.8, + -22.3, + ], + Array [ + 13.108, + -30.991, + ], + Array [ + 15.274999999999999, + -37.766, + ], + Array [ + 19.333, + -42.283, + ], + Array [ + 25.266000000000002, + -44.45, + ], + Array [ + 36.533, + -42.766, + ], + Array [ + 42.7, + -31.333000000000002, + ], + Array [ + 41.466, + -14.625, + ], + Array [ + 32.8, + -6.25, + ], + ], + "o": Array [ + Array [ + 19.333, + -8.416, + ], + Array [ + 15.274999999999999, + -12.891, + ], + Array [ + 13.108, + -19.616, + ], + Array [ + 12.8, + -28.3, + ], + Array [ + 14.341, + -35.758, + ], + Array [ + 17.775, + -41.033, + ], + Array [ + 23.066, + -44.016, + ], + Array [ + 32.8, + -44.45, + ], + Array [ + 41.466, + -36.033, + ], + Array [ + 42.7, + -19.3, + ], + Array [ + 36.533, + -7.925000000000001, + ], + Array [ + 25.266000000000002, + -6.25, + ], + ], + "v": Array [ + Array [ + 21.2, + -7.55, + ], + Array [ + 16.525, + -11.275, + ], + Array [ + 13.725, + -17.25, + ], + Array [ + 12.8, + -25.3, + ], + Array [ + 13.725, + -33.375, + ], + Array [ + 16.525, + -39.4, + ], + Array [ + 21.2, + -43.15, + ], + Array [ + 27.8, + -44.45, + ], + Array [ + 39, + -39.4, + ], + Array [ + 42.7, + -25.3, + ], + Array [ + 39, + -11.275, + ], + Array [ + 27.8, + -6.25, + ], + ], }, - "s": Array [ - -5, - 99, - 0, - ], - "t": 12, - "ti": Array [ - 0, - -5.167, - 0, - ], - "to": Array [ - 0, - 0, - 0, - ], - }, - Object { - "s": Array [ - -5, - 130, - 0, - ], - "t": 24, }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, + "mn": "ADBE Vector Shape - Group", + "nm": "o", + "ty": "sh", + }, + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "o", + "np": 5, + "ty": "gr", }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "ddd": 0, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 111.918, - 0, - ], - "t": 0, - "ti": Array [ - 0, - -3.833, - 0, - ], - "to": Array [ - 0, - -2.153, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 99, - 0, - ], - "t": 6, - "ti": Array [ - 0, - 0, - 0, - ], - "to": Array [ - 0, - 3.151, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 130, - 0, - ], - "t": 18, - "ti": Array [ - 0, - 7.793, - 0, - ], - "to": Array [ - 0, - 0, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 25, - 114.5, - 0, - ], - "t": 24, - "ti": Array [ - 0, - 1.911, - 0, - ], - "to": Array [ - 0, - -6.763, - 0, - ], - }, - Object { - "s": Array [ - 40.75, - 99, - 0, - ], - "t": 30, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - Object { - "ao": 0, - "bm": 0, - "cl": "ai", - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 1, - "ix": 2, - "k": Array [ - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 99, - 0, - ], - "t": 0, - "ti": Array [ - 0, - 0, - 0, - ], - "to": Array [ - 0, - 5.167, - 0, - ], - }, - Object { - "i": Object { - "x": 0.833, - "y": 0.833, - }, - "o": Object { - "x": 0.167, - "y": 0.167, - }, - "s": Array [ - 55, - 130, - 0, - ], - "t": 12, - "ti": Array [ - 0, - 5.167, - 0, - ], - "to": Array [ - 0, - 0, - 0, - ], - }, - Object { - "s": Array [ - 55, - 99, - 0, - ], - "t": 24, - }, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "barre finale.ai", - "op": 24, - "refId": "image_0", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 55.6, }, - ], - "chars": Array [ Object { - "ch": "E", + "ch": "l", "data": Object { "shapes": Array [ Object { @@ -2229,167 +1428,72 @@ exports[`SplashScreenError component should be rendered correctly 1`] = ` "a": 0, "ix": 2, "k": Object { + "__converted": true, "c": true, "i": Array [ Array [ - 0, - 0, + 8.3, + -73.65, ], Array [ - 0, + 8.3, 0, ], Array [ - 0, + 17.2, 0, ], Array [ - 0, - 0, + 17.2, + -73.65, ], + ], + "o": Array [ Array [ - 0, - 0, + 8.3, + -73.65, ], Array [ - 0, + 8.3, 0, ], Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, + 17.2, 0, ], Array [ - 0, - 0, + 17.2, + -73.65, ], ], "v": Array [ Array [ - 8.7, - -71.65, + 8.3, + -73.65, ], Array [ - 8.7, + 8.3, 0, ], Array [ - 52.85, + 17.2, 0, ], Array [ - 52.85, - -7.9, - ], - Array [ - 18.45, - -7.9, - ], - Array [ - 18.45, - -32.35, - ], - Array [ - 46.3, - -32.35, - ], - Array [ - 46.3, - -39.95, - ], - Array [ - 18.45, - -39.95, - ], - Array [ - 18.45, - -63.75, - ], - Array [ - 52.85, - -63.75, - ], - Array [ - 52.85, - -71.65, + 17.2, + -73.65, ], ], }, }, "mn": "ADBE Vector Shape - Group", - "nm": "E", + "nm": "l", "ty": "sh", }, ], "ix": 1, "mn": "ADBE Vector Group", - "nm": "E", + "nm": "l", "np": 3, "ty": "gr", }, @@ -2398,10 +1502,10 @@ exports[`SplashScreenError component should be rendered correctly 1`] = ` "fFamily": "Lato", "size": 77, "style": "Regular", - "w": 58.1, + "w": 25.6, }, Object { - "ch": "c", + "ch": "y", "data": Object { "shapes": Array [ Object { @@ -2417,419 +1521,240 @@ exports[`SplashScreenError component should be rendered correctly 1`] = ` "a": 0, "ix": 2, "k": Object { + "__converted": true, "c": true, "i": Array [ Array [ - 0, - 0, - ], - Array [ - 2.733, - 1.15, - ], - Array [ - 3.533, - 0, - ], - Array [ - 2.966, - -1.3, - ], - Array [ - 2.016, - -2.316, - ], - Array [ - 1.05, - -3.2, - ], - Array [ - 0, - -3.766, - ], - Array [ - -1.15, - -3.233, - ], - Array [ - -2, - -2.216, - ], - Array [ - -2.717, - -1.166, + 50.4, + -50.65, ], Array [ - -3.167, - 0, + 43.3, + -50.65, ], Array [ - -3.3, - 1.25, + 42.208, + -50.475, ], Array [ - -2.2, - 2.7, + 40.900000000000006, + -49.333, ], Array [ - 0, - 0, + 27.55, + -16.95, ], Array [ - 0.766, - 0, + 26.983, + -15.433, ], Array [ - 0.6, - -0.516, + 26.283, + -13.216, ], Array [ - 0.933, - -0.633, + 25.691000000000003, + -13.966, ], Array [ - 1.4, - -0.516, + 25, + -16.165999999999997, ], Array [ - 2.166, - 0, + 11.15, + -48.8, ], Array [ - 1.816, - 0.85, + 10.633, + -49.691, ], Array [ - 1.266, - 1.617, + 9.166, + -50.65, ], Array [ 0.7, - 2.384, - ], - Array [ - 0, - 3.067, - ], - Array [ - -0.65, - 2.367, - ], - Array [ - -1.284, - 1.667, - ], - Array [ - -1.9, - 0.884, - ], - Array [ - -2.467, - 0, - ], - Array [ - -1.284, - -0.416, + -50.65, ], Array [ - -0.9, - -0.5, + 21.6, + -2.95, ], Array [ - -0.584, - -0.416, + 12.35, + 17.15, ], Array [ - -0.5, - 0, + 18.95, + 17.15, ], Array [ - -0.267, - 0.2, + 20.575, + 16.95, ], Array [ - -0.267, - 0.367, + 21.849999999999998, + 15.616, ], ], "o": Array [ Array [ - -2.1, - -2.1, + 50.4, + -50.65, ], Array [ - -2.734, - -1.15, + 42.733, + -50.65, ], Array [ - -3.834, - 0, + 41.241, + -49.775, ], Array [ - -2.967, - 1.3, + 40.7, + -48.8, ], Array [ - -2.017, - 2.317, + 27.25, + -16.183, ], Array [ - -1.05, - 3.2, + 26.516, + -13.966, ], Array [ - 0, - 4.134, + 25.883, + -13.216, ], Array [ - 1.15, - 3.234, + 25.258000000000003, + -15.433, ], Array [ - 2, - 2.217, + 24.7, + -16.9, ], Array [ - 2.716, - 1.166, + 10.950000000000001, + -49.266, ], Array [ - 3.666, - 0, + 9.766, + -50.458000000000006, ], Array [ - 3.3, - -1.25, + 8.4, + -50.65, ], Array [ - 0, - 0, + 0.7, + -50.65, ], Array [ - -0.367, - -0.566, + 21.6, + -2.95, ], Array [ - -0.6, - 0, + 12.35, + 17.15, ], Array [ - -0.6, - 0.517, + 19.883, + 17.15, ], Array [ - -0.934, - 0.634, + 21.474999999999998, + 16.150000000000002, ], Array [ - -1.4, - 0.517, + 22.15, + 14.95, ], + ], + "v": Array [ Array [ - -2.267, - 0, + 50.4, + -50.65, ], Array [ - -1.817, - -0.85, + 43.3, + -50.65, ], Array [ - -1.267, - -1.616, + 41.725, + -50.125, ], Array [ - -0.7, - -2.383, + 40.7, + -48.8, ], Array [ - 0, - -2.933, + 27.55, + -16.95, ], Array [ - 0.65, - -2.366, + 26.75, + -14.7, ], Array [ - 1.283, - -1.666, + 26.05, + -12.45, ], Array [ - 1.9, - -0.883, + 25.475, + -14.7, ], Array [ - 1.866, - 0, + 24.7, + -16.9, ], Array [ - 1.283, - 0.417, + 11.15, + -48.8, ], Array [ - 0.9, - 0.5, + 10.2, + -50.075, ], Array [ - 0.583, - 0.417, + 8.4, + -50.65, ], Array [ - 0.5, - 0, + 0.7, + -50.65, ], Array [ - 0.266, - -0.2, + 21.6, + -2.95, ], Array [ - 0, - 0, + 12.35, + 17.15, ], - ], - "v": Array [ Array [ - 44.2, - -44.85, + 18.95, + 17.15, ], Array [ - 36.95, - -49.725, + 21.025, + 16.55, ], Array [ - 27.55, - -51.45, - ], - Array [ - 17.35, - -49.5, - ], - Array [ - 9.875, - -44.075, - ], - Array [ - 5.275, - -35.8, - ], - Array [ - 3.7, - -25.35, - ], - Array [ - 5.425, - -14.3, - ], - Array [ - 10.15, - -6.125, - ], - Array [ - 17.225, - -1.05, - ], - Array [ - 26.05, - 0.7, - ], - Array [ - 36.5, - -1.175, - ], - Array [ - 44.75, - -7.1, - ], - Array [ - 42.25, - -10.35, - ], - Array [ - 40.55, - -11.2, - ], - Array [ - 38.75, - -10.425, - ], - Array [ - 36.45, - -8.7, - ], - Array [ - 32.95, - -6.975, - ], - Array [ - 27.6, - -6.2, - ], - Array [ - 21.475, - -7.475, - ], - Array [ - 16.85, - -11.175, - ], - Array [ - 13.9, - -17.175, - ], - Array [ - 12.85, - -25.35, - ], - Array [ - 13.825, - -33.3, - ], - Array [ - 16.725, - -39.35, - ], - Array [ - 21.5, - -43.175, - ], - Array [ - 28.05, - -44.5, - ], - Array [ - 32.775, - -43.875, - ], - Array [ - 36.05, - -42.5, - ], - Array [ - 38.275, - -41.125, - ], - Array [ - 39.9, - -40.5, - ], - Array [ - 41.05, - -40.8, - ], - Array [ - 41.85, - -41.65, + 22.15, + 14.95, ], ], }, }, "mn": "ADBE Vector Shape - Group", - "nm": "c", + "nm": "y", "ty": "sh", }, ], "ix": 1, "mn": "ADBE Vector Group", - "nm": "c", + "nm": "y", "np": 3, "ty": "gr", }, @@ -2838,919 +1763,2895 @@ exports[`SplashScreenError component should be rendered correctly 1`] = ` "fFamily": "Lato", "size": 77, "style": "Regular", - "w": 46.7, + "w": 51.2, }, - Object { - "ch": "o", - "data": Object { - "shapes": Array [ + ], + "ddd": 0, + "default": Object { + "assets": Array [ + Object { + "e": 1, + "h": 250, + "id": "image_0", + "p": "data:image/png;base64,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", + "u": "", + "w": 250, + }, + Object { + "e": 1, + "h": 250, + "id": "image_1", + "p": "data:image/png;base64,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", + "u": "", + "w": 250, + }, + Object { + "id": "comp_0", + "layers": Array [ Object { + "ao": 0, "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 2.983, - -1.233, - ], - Array [ - 2.1, - -2.266, - ], - Array [ - 1.133, - -3.216, - ], - Array [ - 0, - -3.966, - ], - Array [ - -1.134, - -3.2, - ], - Array [ - -2.1, - -2.266, - ], - Array [ - -2.984, - -1.216, - ], - Array [ - -3.7, - 0, - ], - Array [ - -2.984, - 1.216, - ], - Array [ - -2.084, - 2.267, - ], - Array [ - -1.117, - 3.2, - ], - Array [ - 0, - 4, - ], - Array [ - 1.116, - 3.217, - ], - Array [ - 2.083, - 2.267, - ], - Array [ - 2.983, - 1.234, - ], - Array [ - 3.7, - 0, - ], - ], - "o": Array [ - Array [ - -2.984, - 1.234, - ], - Array [ - -2.1, - 2.267, - ], - Array [ - -1.134, - 3.217, - ], - Array [ - 0, - 4, - ], - Array [ - 1.133, - 3.2, - ], - Array [ - 2.1, - 2.267, - ], - Array [ - 2.983, - 1.216, - ], - Array [ - 3.7, - 0, - ], - Array [ - 2.983, - -1.216, - ], - Array [ - 2.083, - -2.266, - ], - Array [ - 1.116, - -3.2, - ], - Array [ - 0, - -3.966, - ], - Array [ - -1.117, - -3.216, - ], - Array [ - -2.084, - -2.266, - ], - Array [ - -2.984, - -1.233, - ], - Array [ - -3.7, - 0, - ], - ], - "v": Array [ - Array [ - 17.775, - -49.6, - ], - Array [ - 10.15, - -44.35, - ], - Array [ - 5.3, - -36.125, - ], - Array [ - 3.6, - -25.35, - ], - Array [ - 5.3, - -14.55, - ], - Array [ - 10.15, - -6.35, - ], - Array [ - 17.775, - -1.125, - ], - Array [ - 27.8, - 0.7, - ], - Array [ - 37.825, - -1.125, - ], - Array [ - 45.425, - -6.35, - ], - Array [ - 50.225, - -14.55, - ], - Array [ - 51.9, - -25.35, - ], - Array [ - 50.225, - -36.125, - ], - Array [ - 45.425, - -44.35, - ], - Array [ - 37.825, - -49.6, - ], - Array [ - 27.8, - -51.45, - ], + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 130, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 99, + 0, + ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + -5, + 130, + 0, ], + "t": 24, }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", + ], }, - Object { - "hd": false, - "ind": 1, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, + }, + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, "ix": 2, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 1.866, - 0.867, - ], - Array [ - 1.25, - 1.617, - ], - Array [ - 0.616, - 2.367, - ], - Array [ - 0, - 3, - ], - Array [ - -0.617, - 2.384, - ], - Array [ - -1.25, - 1.634, - ], - Array [ - -1.867, - 0.867, - ], - Array [ - -2.534, - 0, - ], - Array [ - -2.467, - -3.366, - ], - Array [ - 0, - -6.033, - ], - Array [ - 2.466, - -3.35, - ], - Array [ - 5, - 0, - ], + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 111.918, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 99, + 0, + ], + "t": 6, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 130, + 0, + ], + "t": 18, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 114.5, + 0, ], - "o": Array [ - Array [ - -1.867, - -0.866, - ], - Array [ - -1.25, - -1.616, - ], - Array [ - -0.617, - -2.366, - ], - Array [ - 0, - -3, - ], - Array [ - 0.616, - -2.383, - ], - Array [ - 1.25, - -1.633, - ], - Array [ - 1.866, - -0.866, - ], - Array [ - 5, - 0, - ], - Array [ - 2.466, - 3.367, - ], - Array [ - 0, - 6, - ], - Array [ - -2.467, - 3.35, - ], - Array [ - -2.534, - 0, - ], + "t": 24, + "ti": Array [ + 0, + 1.911, + 0, ], - "v": Array [ - Array [ - 21.2, - -7.55, - ], - Array [ - 16.525, - -11.275, - ], - Array [ - 13.725, - -17.25, - ], - Array [ - 12.8, - -25.3, - ], - Array [ - 13.725, - -33.375, - ], - Array [ - 16.525, - -39.4, - ], - Array [ - 21.2, - -43.15, - ], - Array [ - 27.8, - -44.45, - ], - Array [ - 39, - -39.4, - ], - Array [ - 42.7, - -25.3, - ], - Array [ - 39, - -11.275, - ], - Array [ - 27.8, - -6.25, - ], + "to": Array [ + 0, + -6.763, + 0, ], }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "o", - "ty": "sh", + Object { + "s": Array [ + 40.75, + 99, + 0, + ], + "t": 30, + }, + ], }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "o", - "np": 5, - "ty": "gr", + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, - ], - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 55.6, - }, - Object { - "ch": "l", - "data": Object { - "shapes": Array [ Object { + "ao": 0, "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ - Object { - "hd": false, - "ind": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 3, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "v": Array [ - Array [ - 8.3, - -73.65, - ], - Array [ - 8.3, - 0, - ], - Array [ - 17.2, - 0, - ], - Array [ - 17.2, - -73.65, - ], + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 99, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 130, + 0, + ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + 55, + 99, + 0, ], + "t": 24, }, - }, - "mn": "ADBE Vector Shape - Group", - "nm": "l", - "ty": "sh", + ], }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "l", - "np": 3, - "ty": "gr", + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, ], }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 25.6, + ], + "chars": Array [ + Object { + "ch": "E", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 8.7, + -71.65, + ], + Array [ + 8.7, + 0, + ], + Array [ + 52.85, + 0, + ], + Array [ + 52.85, + -7.9, + ], + Array [ + 18.45, + -7.9, + ], + Array [ + 18.45, + -32.35, + ], + Array [ + 46.3, + -32.35, + ], + Array [ + 46.3, + -39.95, + ], + Array [ + 18.45, + -39.95, + ], + Array [ + 18.45, + -63.75, + ], + Array [ + 52.85, + -63.75, + ], + Array [ + 52.85, + -71.65, + ], + ], + "o": Array [ + Array [ + 8.7, + -71.65, + ], + Array [ + 8.7, + 0, + ], + Array [ + 52.85, + 0, + ], + Array [ + 52.85, + -7.9, + ], + Array [ + 18.45, + -7.9, + ], + Array [ + 18.45, + -32.35, + ], + Array [ + 46.3, + -32.35, + ], + Array [ + 46.3, + -39.95, + ], + Array [ + 18.45, + -39.95, + ], + Array [ + 18.45, + -63.75, + ], + Array [ + 52.85, + -63.75, + ], + Array [ + 52.85, + -71.65, + ], + ], + "v": Array [ + Array [ + 8.7, + -71.65, + ], + Array [ + 8.7, + 0, + ], + Array [ + 52.85, + 0, + ], + Array [ + 52.85, + -7.9, + ], + Array [ + 18.45, + -7.9, + ], + Array [ + 18.45, + -32.35, + ], + Array [ + 46.3, + -32.35, + ], + Array [ + 46.3, + -39.95, + ], + Array [ + 18.45, + -39.95, + ], + Array [ + 18.45, + -63.75, + ], + Array [ + 52.85, + -63.75, + ], + Array [ + 52.85, + -71.65, + ], + ], + }, + }, + "mn": "ADBE Vector Shape - Group", + "nm": "E", + "ty": "sh", + }, + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "E", + "np": 3, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 58.1, + }, + Object { + "ch": "c", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 44.2, + -44.85, + ], + Array [ + 39.683, + -48.575, + ], + Array [ + 31.083000000000002, + -51.45, + ], + Array [ + 20.316000000000003, + -50.8, + ], + Array [ + 11.891, + -46.391000000000005, + ], + Array [ + 6.325, + -39, + ], + Array [ + 3.7, + -29.116, + ], + Array [ + 4.275, + -17.533, + ], + Array [ + 8.15, + -8.341000000000001, + ], + Array [ + 14.508000000000001, + -2.216, + ], + Array [ + 22.883000000000003, + 0.7, + ], + Array [ + 33.2, + 0.07499999999999996, + ], + Array [ + 42.55, + -4.3999999999999995, + ], + Array [ + 42.25, + -10.35, + ], + Array [ + 41.315999999999995, + -11.2, + ], + Array [ + 39.35, + -10.941, + ], + Array [ + 37.383, + -9.332999999999998, + ], + Array [ + 34.35, + -7.491, + ], + Array [ + 29.766000000000002, + -6.2, + ], + Array [ + 23.291, + -6.625, + ], + Array [ + 18.116, + -9.558, + ], + Array [ + 14.6, + -14.791, + ], + Array [ + 12.85, + -22.283, + ], + Array [ + 13.174999999999999, + -30.932999999999996, + ], + Array [ + 15.441, + -37.683, + ], + Array [ + 19.6, + -42.291, + ], + Array [ + 25.583000000000002, + -44.5, + ], + Array [ + 31.491, + -44.291, + ], + Array [ + 35.15, + -43, + ], + Array [ + 37.690999999999995, + -41.541, + ], + Array [ + 39.4, + -40.5, + ], + Array [ + 40.782999999999994, + -40.599999999999994, + ], + Array [ + 41.583, + -41.283, + ], + ], + "o": Array [ + Array [ + 42.1, + -46.95, + ], + Array [ + 34.216, + -50.875, + ], + Array [ + 23.716, + -51.45, + ], + Array [ + 14.383000000000001, + -48.2, + ], + Array [ + 7.8580000000000005, + -41.758, + ], + Array [ + 4.2250000000000005, + -32.599999999999994, + ], + Array [ + 3.7, + -21.216, + ], + Array [ + 6.574999999999999, + -11.066, + ], + Array [ + 12.15, + -3.908, + ], + Array [ + 19.941000000000003, + 0.11599999999999988, + ], + Array [ + 29.716, + 0.7, + ], + Array [ + 39.8, + -2.425, + ], + Array [ + 44.75, + -7.1, + ], + Array [ + 41.883, + -10.916, + ], + Array [ + 39.949999999999996, + -11.2, + ], + Array [ + 38.15, + -9.908000000000001, + ], + Array [ + 35.516000000000005, + -8.065999999999999, + ], + Array [ + 31.550000000000004, + -6.457999999999999, + ], + Array [ + 25.333000000000002, + -6.2, + ], + Array [ + 19.658, + -8.325, + ], + Array [ + 15.583000000000002, + -12.791, + ], + Array [ + 13.200000000000001, + -19.558, + ], + Array [ + 12.85, + -28.283, + ], + Array [ + 14.475, + -35.666, + ], + Array [ + 18.008000000000003, + -41.016, + ], + Array [ + 23.4, + -44.058, + ], + Array [ + 29.916, + -44.5, + ], + Array [ + 34.058, + -43.458, + ], + Array [ + 36.949999999999996, + -42, + ], + Array [ + 38.858, + -40.708, + ], + Array [ + 40.4, + -40.5, + ], + Array [ + 41.315999999999995, + -41, + ], + Array [ + 41.85, + -41.65, + ], + ], + "v": Array [ + Array [ + 44.2, + -44.85, + ], + Array [ + 36.95, + -49.725, + ], + Array [ + 27.55, + -51.45, + ], + Array [ + 17.35, + -49.5, + ], + Array [ + 9.875, + -44.075, + ], + Array [ + 5.275, + -35.8, + ], + Array [ + 3.7, + -25.35, + ], + Array [ + 5.425, + -14.3, + ], + Array [ + 10.15, + -6.125, + ], + Array [ + 17.225, + -1.05, + ], + Array [ + 26.05, + 0.7, + ], + Array [ + 36.5, + -1.175, + ], + Array [ + 44.75, + -7.1, + ], + Array [ + 42.25, + -10.35, + ], + Array [ + 40.55, + -11.2, + ], + Array [ + 38.75, + -10.425, + ], + Array [ + 36.45, + -8.7, + ], + Array [ + 32.95, + -6.975, + ], + Array [ + 27.6, + -6.2, + ], + Array [ + 21.475, + -7.475, + ], + Array [ + 16.85, + -11.175, + ], + Array [ + 13.9, + -17.175, + ], + Array [ + 12.85, + -25.35, + ], + Array [ + 13.825, + -33.3, + ], + Array [ + 16.725, + -39.35, + ], + Array [ + 21.5, + -43.175, + ], + Array [ + 28.05, + -44.5, + ], + Array [ + 32.775, + -43.875, + ], + Array [ + 36.05, + -42.5, + ], + Array [ + 38.275, + -41.125, + ], + Array [ + 39.9, + -40.5, + ], + Array [ + 41.05, + -40.8, + ], + Array [ + 41.85, + -41.65, + ], + ], + }, + }, + "mn": "ADBE Vector Shape - Group", + "nm": "c", + "ty": "sh", + }, + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "c", + "np": 3, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 46.7, + }, + Object { + "ch": "o", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 20.758, + -50.833, + ], + Array [ + 12.25, + -46.616, + ], + Array [ + 6.433, + -39.341, + ], + Array [ + 3.6, + -29.316000000000003, + ], + Array [ + 4.166, + -17.75, + ], + Array [ + 8.05, + -8.616, + ], + Array [ + 14.790999999999999, + -2.341, + ], + Array [ + 24.1, + 0.7, + ], + Array [ + 34.841, + 0.09099999999999997, + ], + Array [ + 43.340999999999994, + -4.083, + ], + Array [ + 49.108000000000004, + -11.350000000000001, + ], + Array [ + 51.9, + -21.35, + ], + Array [ + 51.341, + -32.908, + ], + Array [ + 47.507999999999996, + -42.083, + ], + Array [ + 40.808, + -48.366, + ], + Array [ + 31.5, + -51.45, + ], + ], + "o": Array [ + Array [ + 14.790999999999999, + -48.366, + ], + Array [ + 8.05, + -42.083, + ], + Array [ + 4.166, + -32.908, + ], + Array [ + 3.6, + -21.35, + ], + Array [ + 6.433, + -11.350000000000001, + ], + Array [ + 12.25, + -4.083, + ], + Array [ + 20.758, + 0.09099999999999997, + ], + Array [ + 31.5, + 0.7, + ], + Array [ + 40.808, + -2.341, + ], + Array [ + 47.507999999999996, + -8.616, + ], + Array [ + 51.341, + -17.75, + ], + Array [ + 51.9, + -29.316000000000003, + ], + Array [ + 49.108000000000004, + -39.341, + ], + Array [ + 43.340999999999994, + -46.616, + ], + Array [ + 34.841, + -50.833, + ], + Array [ + 24.1, + -51.45, + ], + ], + "v": Array [ + Array [ + 17.775, + -49.6, + ], + Array [ + 10.15, + -44.35, + ], + Array [ + 5.3, + -36.125, + ], + Array [ + 3.6, + -25.35, + ], + Array [ + 5.3, + -14.55, + ], + Array [ + 10.15, + -6.35, + ], + Array [ + 17.775, + -1.125, + ], + Array [ + 27.8, + 0.7, + ], + Array [ + 37.825, + -1.125, + ], + Array [ + 45.425, + -6.35, + ], + Array [ + 50.225, + -14.55, + ], + Array [ + 51.9, + -25.35, + ], + Array [ + 50.225, + -36.125, + ], + Array [ + 45.425, + -44.35, + ], + Array [ + 37.825, + -49.6, + ], + Array [ + 27.8, + -51.45, + ], + ], + }, + }, + "mn": "ADBE Vector Shape - Group", + "nm": "o", + "ty": "sh", + }, + Object { + "hd": false, + "ind": 1, + "ix": 2, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 23.066, + -6.683, + ], + Array [ + 17.775, + -9.658000000000001, + ], + Array [ + 14.341, + -14.883, + ], + Array [ + 12.8, + -22.3, + ], + Array [ + 13.108, + -30.991, + ], + Array [ + 15.274999999999999, + -37.766, + ], + Array [ + 19.333, + -42.283, + ], + Array [ + 25.266000000000002, + -44.45, + ], + Array [ + 36.533, + -42.766, + ], + Array [ + 42.7, + -31.333000000000002, + ], + Array [ + 41.466, + -14.625, + ], + Array [ + 32.8, + -6.25, + ], + ], + "o": Array [ + Array [ + 19.333, + -8.416, + ], + Array [ + 15.274999999999999, + -12.891, + ], + Array [ + 13.108, + -19.616, + ], + Array [ + 12.8, + -28.3, + ], + Array [ + 14.341, + -35.758, + ], + Array [ + 17.775, + -41.033, + ], + Array [ + 23.066, + -44.016, + ], + Array [ + 32.8, + -44.45, + ], + Array [ + 41.466, + -36.033, + ], + Array [ + 42.7, + -19.3, + ], + Array [ + 36.533, + -7.925000000000001, + ], + Array [ + 25.266000000000002, + -6.25, + ], + ], + "v": Array [ + Array [ + 21.2, + -7.55, + ], + Array [ + 16.525, + -11.275, + ], + Array [ + 13.725, + -17.25, + ], + Array [ + 12.8, + -25.3, + ], + Array [ + 13.725, + -33.375, + ], + Array [ + 16.525, + -39.4, + ], + Array [ + 21.2, + -43.15, + ], + Array [ + 27.8, + -44.45, + ], + Array [ + 39, + -39.4, + ], + Array [ + 42.7, + -25.3, + ], + Array [ + 39, + -11.275, + ], + Array [ + 27.8, + -6.25, + ], + ], + }, + }, + "mn": "ADBE Vector Shape - Group", + "nm": "o", + "ty": "sh", + }, + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "o", + "np": 5, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 55.6, + }, + Object { + "ch": "l", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 8.3, + -73.65, + ], + Array [ + 8.3, + 0, + ], + Array [ + 17.2, + 0, + ], + Array [ + 17.2, + -73.65, + ], + ], + "o": Array [ + Array [ + 8.3, + -73.65, + ], + Array [ + 8.3, + 0, + ], + Array [ + 17.2, + 0, + ], + Array [ + 17.2, + -73.65, + ], + ], + "v": Array [ + Array [ + 8.3, + -73.65, + ], + Array [ + 8.3, + 0, + ], + Array [ + 17.2, + 0, + ], + Array [ + 17.2, + -73.65, + ], + ], + }, + }, + "mn": "ADBE Vector Shape - Group", + "nm": "l", + "ty": "sh", + }, + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "l", + "np": 3, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 25.6, + }, + Object { + "ch": "y", + "data": Object { + "shapes": Array [ + Object { + "bm": 0, + "cix": 2, + "hd": false, + "it": Array [ + Object { + "hd": false, + "ind": 0, + "ix": 1, + "ks": Object { + "a": 0, + "ix": 2, + "k": Object { + "__converted": true, + "c": true, + "i": Array [ + Array [ + 50.4, + -50.65, + ], + Array [ + 43.3, + -50.65, + ], + Array [ + 42.208, + -50.475, + ], + Array [ + 40.900000000000006, + -49.333, + ], + Array [ + 27.55, + -16.95, + ], + Array [ + 26.983, + -15.433, + ], + Array [ + 26.283, + -13.216, + ], + Array [ + 25.691000000000003, + -13.966, + ], + Array [ + 25, + -16.165999999999997, + ], + Array [ + 11.15, + -48.8, + ], + Array [ + 10.633, + -49.691, + ], + Array [ + 9.166, + -50.65, + ], + Array [ + 0.7, + -50.65, + ], + Array [ + 21.6, + -2.95, + ], + Array [ + 12.35, + 17.15, + ], + Array [ + 18.95, + 17.15, + ], + Array [ + 20.575, + 16.95, + ], + Array [ + 21.849999999999998, + 15.616, + ], + ], + "o": Array [ + Array [ + 50.4, + -50.65, + ], + Array [ + 42.733, + -50.65, + ], + Array [ + 41.241, + -49.775, + ], + Array [ + 40.7, + -48.8, + ], + Array [ + 27.25, + -16.183, + ], + Array [ + 26.516, + -13.966, + ], + Array [ + 25.883, + -13.216, + ], + Array [ + 25.258000000000003, + -15.433, + ], + Array [ + 24.7, + -16.9, + ], + Array [ + 10.950000000000001, + -49.266, + ], + Array [ + 9.766, + -50.458000000000006, + ], + Array [ + 8.4, + -50.65, + ], + Array [ + 0.7, + -50.65, + ], + Array [ + 21.6, + -2.95, + ], + Array [ + 12.35, + 17.15, + ], + Array [ + 19.883, + 17.15, + ], + Array [ + 21.474999999999998, + 16.150000000000002, + ], + Array [ + 22.15, + 14.95, + ], + ], + "v": Array [ + Array [ + 50.4, + -50.65, + ], + Array [ + 43.3, + -50.65, + ], + Array [ + 41.725, + -50.125, + ], + Array [ + 40.7, + -48.8, + ], + Array [ + 27.55, + -16.95, + ], + Array [ + 26.75, + -14.7, + ], + Array [ + 26.05, + -12.45, + ], + Array [ + 25.475, + -14.7, + ], + Array [ + 24.7, + -16.9, + ], + Array [ + 11.15, + -48.8, + ], + Array [ + 10.2, + -50.075, + ], + Array [ + 8.4, + -50.65, + ], + Array [ + 0.7, + -50.65, + ], + Array [ + 21.6, + -2.95, + ], + Array [ + 12.35, + 17.15, + ], + Array [ + 18.95, + 17.15, + ], + Array [ + 21.025, + 16.55, + ], + Array [ + 22.15, + 14.95, + ], + ], + }, + }, + "mn": "ADBE Vector Shape - Group", + "nm": "y", + "ty": "sh", + }, + ], + "ix": 1, + "mn": "ADBE Vector Group", + "nm": "y", + "np": 3, + "ty": "gr", + }, + ], + }, + "fFamily": "Lato", + "size": 77, + "style": "Regular", + "w": 51.2, + }, + ], + "ddd": 0, + "fonts": Object { + "list": Array [ + Object { + "ascent": 73.699951171875, + "fFamily": "Lato", + "fName": "Lato-Regular", + "fStyle": "Regular", + }, + ], }, - Object { - "ch": "y", - "data": Object { - "shapes": Array [ - Object { - "bm": 0, - "cix": 2, - "hd": false, - "it": Array [ + "fr": 25, + "h": 500, + "ip": 0, + "layers": Array [ + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 0, + 0, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 254, + 417.75, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "nm": "Ecolyo", + "op": 13, + "singleShape": true, + "sr": 1, + "st": 0, + "t": Object { + "a": Array [], + "d": Object { + "k": Array [ Object { - "hd": false, - "ind": 0, - "ix": 1, - "ks": Object { - "a": 0, - "ix": 2, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0.483, - -0.35, - ], - Array [ - 0.2, - -0.533, - ], - Array [ - 0, - 0, - ], - Array [ - 0.233, - -0.733, - ], - Array [ - 0.233, - -0.766, - ], - Array [ - 0.216, - 0.734, - ], - Array [ - 0.3, - 0.734, - ], - Array [ - 0, - 0, - ], - Array [ - 0.433, - 0.384, - ], - Array [ - 0.766, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - -0.45, - 0.4, - ], - Array [ - -0.3, - 0.666, - ], + "s": Object { + "f": "Lato-Regular", + "fc": Array [ + 0.922, + 0.922, + 0.922, + ], + "j": 2, + "lh": 92.4, + "ls": 0, + "ps": Array [ + -255.5, + -56.25, + ], + "s": 77, + "sz": Array [ + 501, + 112.5, + ], + "t": "Ecolyo", + "tr": 0, + }, + "t": 0, + }, + ], + }, + "m": Object { + "a": Object { + "a": 0, + "ix": 2, + "k": Array [ + 0, + 0, + ], + }, + "g": 1, + }, + "p": Object {}, + }, + "ty": 5, + }, + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "h": 140, + "hasMask": true, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 60, + 70, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 256, + 224.5, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "layers": Array [ + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 130, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 99, + 0, + ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + -5, + 130, + 0, ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - -0.567, - 0, - ], - Array [ - -0.484, - 0.35, - ], - Array [ - 0, - 0, - ], - Array [ - -0.3, - 0.767, - ], - Array [ - -0.234, - 0.734, - ], - Array [ - -0.167, - -0.766, - ], - Array [ - -0.217, - -0.733, - ], - Array [ - 0, - 0, - ], - Array [ - -0.2, - -0.466, - ], - Array [ - -0.434, - -0.383, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0.933, - 0, - ], - Array [ - 0.45, - -0.4, - ], - Array [ - 0, - 0, - ], + "t": 24, + }, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, + }, + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 111.918, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 99, + 0, + ], + "t": 6, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 130, + 0, + ], + "t": 18, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 114.5, + 0, ], - "v": Array [ - Array [ - 50.4, - -50.65, - ], - Array [ - 43.3, - -50.65, - ], - Array [ - 41.725, - -50.125, - ], - Array [ - 40.7, - -48.8, - ], - Array [ - 27.55, - -16.95, - ], - Array [ - 26.75, - -14.7, - ], - Array [ - 26.05, - -12.45, - ], - Array [ - 25.475, - -14.7, - ], - Array [ - 24.7, - -16.9, - ], - Array [ - 11.15, - -48.8, - ], - Array [ - 10.2, - -50.075, - ], - Array [ - 8.4, - -50.65, - ], - Array [ - 0.7, - -50.65, - ], - Array [ - 21.6, - -2.95, - ], - Array [ - 12.35, - 17.15, - ], - Array [ - 18.95, - 17.15, - ], - Array [ - 21.025, - 16.55, - ], - Array [ - 22.15, - 14.95, - ], + "t": 24, + "ti": Array [ + 0, + 1.911, + 0, + ], + "to": Array [ + 0, + -6.763, + 0, ], }, + Object { + "s": Array [ + 40.75, + 99, + 0, + ], + "t": 30, + }, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, + }, + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 3, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 99, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 130, + 0, + ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + 55, + 99, + 0, + ], + "t": 24, + }, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, + }, + ], + "masksProperties": Array [ + Object { + "inv": false, + "mode": "a", + "nm": "Masque 1", + "o": Object { + "a": 0, + "ix": 3, + "k": 100, + }, + "pt": Object { + "a": 0, + "ix": 1, + "k": Object { + "c": true, + "i": Array [ + Array [ + 139.039, + -41, + ], + Array [ + -18, + -41, + ], + Array [ + -18, + 85.184, + ], + Array [ + 139.039, + 85.184, + ], + ], + "o": Array [ + Array [ + 139.039, + -41, + ], + Array [ + -18, + -41, + ], + Array [ + -18, + 85.184, + ], + Array [ + 139.039, + 85.184, + ], + ], + "v": Array [ + Array [ + 139.039, + -41, + ], + Array [ + -18, + -41, + ], + Array [ + -18, + 85.184, + ], + Array [ + 139.039, + 85.184, + ], + ], + }, + }, + "x": Object { + "a": 0, + "ix": 4, + "k": 0, + }, + }, + ], + "nm": "compo barre", + "op": 13.2, + "refId": "comp_0", + "sr": 0.55, + "st": 0, + "ty": 0, + "w": 120, + }, + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "ind": 3, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 250, + 250, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "bouclier", + "op": 13, + "refId": "image_1", + "sr": 1, + "st": 0, + "ty": 2, + }, + ], + "markers": Array [], + "meta": Object { + "a": "", + "d": "", + "g": "LottieFiles AE 0.1.20", + "k": "", + "tc": "", + }, + "nm": "splash illu", + "op": 13, + "v": "5.5.7", + "w": 500, + }, + "fonts": Object { + "list": Array [ + Object { + "ascent": 73.699951171875, + "fFamily": "Lato", + "fName": "Lato-Regular", + "fStyle": "Regular", + }, + ], + }, + "fr": 25, + "h": 500, + "ip": 0, + "layers": Array [ + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 0, + 0, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 254, + 417.75, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "nm": "Ecolyo", + "op": 13, + "singleShape": true, + "sr": 1, + "st": 0, + "t": Object { + "a": Array [], + "d": Object { + "k": Array [ + Object { + "s": Object { + "f": "Lato-Regular", + "fc": Array [ + 0.922, + 0.922, + 0.922, + ], + "j": 2, + "lh": 92.4, + "ls": 0, + "ps": Array [ + -255.5, + -56.25, + ], + "s": 77, + "sz": Array [ + 501, + 112.5, + ], + "t": "Ecolyo", + "tr": 0, + }, + "t": 0, + }, + ], + }, + "m": Object { + "a": Object { + "a": 0, + "ix": 2, + "k": Array [ + 0, + 0, + ], + }, + "g": 1, + }, + "p": Object {}, + }, + "ty": 5, + }, + Object { + "ao": 0, + "bm": 0, + "completed": true, + "ddd": 0, + "h": 140, + "hasMask": true, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 60, + 70, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 0, + "ix": 2, + "k": Array [ + 256, + 224.5, + 0, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 100, + 100, + 100, + ], + }, + }, + "layers": Array [ + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 1, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 130, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + -5, + 99, + 0, + ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + -5, + 130, + 0, + ], + "t": 24, + }, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, + }, + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, + }, + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 2, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 111.918, + 0, + ], + "t": 0, + "ti": null, + "to": null, }, - "mn": "ADBE Vector Shape - Group", - "nm": "y", - "ty": "sh", - }, - ], - "ix": 1, - "mn": "ADBE Vector Group", - "nm": "y", - "np": 3, - "ty": "gr", + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 99, + 0, + ], + "t": 6, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 130, + 0, + ], + "t": 18, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 25, + 114.5, + 0, + ], + "t": 24, + "ti": Array [ + 0, + 1.911, + 0, + ], + "to": Array [ + 0, + -6.763, + 0, + ], + }, + Object { + "s": Array [ + 40.75, + 99, + 0, + ], + "t": 30, + }, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], + }, }, - ], - }, - "fFamily": "Lato", - "size": 77, - "style": "Regular", - "w": 51.2, - }, - ], - "ddd": 0, - "fonts": Object { - "list": Array [ - Object { - "ascent": 73.699951171875, - "fFamily": "Lato", - "fName": "Lato-Regular", - "fStyle": "Regular", - }, - ], - }, - "fr": 25, - "h": 500, - "ip": 0, - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 0, - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 254, - 417.75, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, - }, - "nm": "Ecolyo", - "op": 13, - "sr": 1, - "st": 0, - "t": Object { - "a": Array [], - "d": Object { - "k": Array [ - Object { - "s": Object { - "f": "Lato-Regular", - "fc": Array [ - 0.922, - 0.922, - 0.922, - ], - "j": 2, - "lh": 92.4, - "ls": 0, - "ps": Array [ - -255.5, - -56.25, - ], - "s": 77, - "sz": Array [ - 501, - 112.5, - ], - "t": "Ecolyo", - "tr": 0, - }, - "t": 0, + Object { + "ao": 0, + "bm": 0, + "cl": "ai", + "completed": true, + "ddd": 0, + "ind": 3, + "ip": 0, + "ks": Object { + "a": Object { + "a": 0, + "ix": 1, + "k": Array [ + 125, + 125, + 0, + ], + }, + "o": Object { + "a": 0, + "ix": 11, + "k": 100, + }, + "p": Object { + "a": 1, + "ix": 2, + "k": Array [ + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "keyframeMetadata": [Function], + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 99, + 0, + ], + "t": 0, + "ti": null, + "to": null, + }, + Object { + "i": Object { + "x": 0.833, + "y": 0.833, + }, + "o": Object { + "x": 0.167, + "y": 0.167, + }, + "s": Array [ + 55, + 130, + 0, + ], + "t": 12, + "ti": null, + "to": null, + }, + Object { + "s": Array [ + 55, + 99, + 0, + ], + "t": 24, + }, + ], + }, + "r": Object { + "a": 0, + "ix": 10, + "k": 0, + }, + "s": Object { + "a": 0, + "ix": 6, + "k": Array [ + 150, + 150, + 100, + ], }, - ], - }, - "m": Object { - "a": Object { - "a": 0, - "ix": 2, - "k": Array [ - 0, - 0, - ], }, - "g": 1, - }, - "p": Object {}, - }, - "ty": 5, - }, - Object { - "ao": 0, - "bm": 0, - "ddd": 0, - "h": 140, - "hasMask": true, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 60, - 70, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 256, - 224.5, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], + "nm": "barre finale.ai", + "op": 24, + "refId": "image_0", + "sr": 1, + "st": 0, + "ty": 2, }, - }, + ], "masksProperties": Array [ Object { "inv": false, @@ -3768,38 +4669,38 @@ exports[`SplashScreenError component should be rendered correctly 1`] = ` "c": true, "i": Array [ Array [ - 0, - 0, + 139.039, + -41, ], Array [ - 0, - 0, + -18, + -41, ], Array [ - 0, - 0, + -18, + 85.184, ], Array [ - 0, - 0, + 139.039, + 85.184, ], ], "o": Array [ Array [ - 0, - 0, + 139.039, + -41, ], Array [ - 0, - 0, + -18, + -41, ], Array [ - 0, - 0, + -18, + 85.184, ], Array [ - 0, - 0, + 139.039, + 85.184, ], ], "v": Array [ @@ -3840,6 +4741,7 @@ exports[`SplashScreenError component should be rendered correctly 1`] = ` Object { "ao": 0, "bm": 0, + "completed": true, "ddd": 0, "ind": 3, "ip": 0, @@ -3903,342 +4805,49 @@ exports[`SplashScreenError component should be rendered correctly 1`] = ` "v": "5.5.7", "w": 500, }, - "fonts": Object { - "list": Array [ - Object { - "ascent": 73.699951171875, - "fFamily": "Lato", - "fName": "Lato-Regular", - "fStyle": "Regular", - }, - ], - }, - "fr": 25, - "h": 500, - "ip": 0, - "layers": Array [ - Object { - "ao": 0, - "bm": 0, - "ddd": 0, - "ind": 1, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 0, - 0, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 254, - 417.75, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], - }, - }, - "nm": "Ecolyo", - "op": 13, - "sr": 1, - "st": 0, - "t": Object { - "a": Array [], - "d": Object { - "k": Array [ - Object { - "s": Object { - "f": "Lato-Regular", - "fc": Array [ - 0.922, - 0.922, - 0.922, - ], - "j": 2, - "lh": 92.4, - "ls": 0, - "ps": Array [ - -255.5, - -56.25, - ], - "s": 77, - "sz": Array [ - 501, - 112.5, - ], - "t": "Ecolyo", - "tr": 0, - }, - "t": 0, - }, - ], - }, - "m": Object { - "a": Object { - "a": 0, - "ix": 2, - "k": Array [ - 0, - 0, - ], - }, - "g": 1, - }, - "p": Object {}, - }, - "ty": 5, - }, - Object { - "ao": 0, - "bm": 0, - "ddd": 0, - "h": 140, - "hasMask": true, - "ind": 2, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 60, - 70, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 256, - 224.5, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 100, - 100, - 100, - ], - }, - }, - "masksProperties": Array [ - Object { - "inv": false, - "mode": "a", - "nm": "Masque 1", - "o": Object { - "a": 0, - "ix": 3, - "k": 100, - }, - "pt": Object { - "a": 0, - "ix": 1, - "k": Object { - "c": true, - "i": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "o": Array [ - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - Array [ - 0, - 0, - ], - ], - "v": Array [ - Array [ - 139.039, - -41, - ], - Array [ - -18, - -41, - ], - Array [ - -18, - 85.184, - ], - Array [ - 139.039, - 85.184, - ], - ], - }, - }, - "x": Object { - "a": 0, - "ix": 4, - "k": 0, - }, - }, - ], - "nm": "compo barre", - "op": 13.2, - "refId": "comp_0", - "sr": 0.55, - "st": 0, - "ty": 0, - "w": 120, - }, - Object { - "ao": 0, - "bm": 0, - "ddd": 0, - "ind": 3, - "ip": 0, - "ks": Object { - "a": Object { - "a": 0, - "ix": 1, - "k": Array [ - 125, - 125, - 0, - ], - }, - "o": Object { - "a": 0, - "ix": 11, - "k": 100, - }, - "p": Object { - "a": 0, - "ix": 2, - "k": Array [ - 250, - 250, - 0, - ], - }, - "r": Object { - "a": 0, - "ix": 10, - "k": 0, - }, - "s": Object { - "a": 0, - "ix": 6, - "k": Array [ - 150, - 150, - 100, - ], - }, - }, - "nm": "bouclier", - "op": 13, - "refId": "image_1", - "sr": 1, - "st": 0, - "ty": 2, - }, - ], - "markers": Array [], - "meta": Object { - "a": "", - "d": "", - "g": "LottieFiles AE 0.1.20", - "k": "", - "tc": "", + "autoplay": false, + "loop": false, + "rendererSettings": Object { + "preserveAspectRatio": "xMidYMid slice", }, - "nm": "splash illu", - "op": 13, - "v": "5.5.7", - "w": 500, - }, - "autoplay": false, - "loop": false, - "rendererSettings": Object { - "preserveAspectRatio": "xMidYMid slice", - }, + } } - } - speed={1} - title="" - width={300} - /> - <div - className="splash-logos-container" - > - <img - alt="ensemble de logos" - src="test-file-stub" - /> + speed={1} + title="" + width={200} + > + <div + aria-label="animation" + onClick={[Function]} + role="button" + style={ + Object { + "height": "200px", + "margin": "0 auto", + "outline": "none", + "overflow": "hidden", + "width": "200px", + } + } + tabIndex="0" + title="" + /> + </Lottie> + <div + className="splash-error-text text-20-bold" + > + splashscreen.error_loading + </div> + <div + className="splash-error-text text-18-normal" + > + splashscreen.consent_error + </div> </div> </div> <div className="splash-footer" > - <div - className="splash-footer-error-text text-16-normal" - > - splashscreen.error_loading - </div> <WithStyles(ForwardRef(Button)) aria-label="splashscreen.accessibility.button_reload" className="splash-footer-button" @@ -4250,8 +4859,130 @@ exports[`SplashScreenError component should be rendered correctly 1`] = ` } onClick={[Function]} > - splashscreen.button_reload + <ForwardRef(Button) + aria-label="splashscreen.accessibility.button_reload" + className="splash-footer-button" + classes={ + Object { + "colorInherit": "MuiButton-colorInherit", + "contained": "MuiButton-contained", + "containedPrimary": "MuiButton-containedPrimary", + "containedSecondary": "MuiButton-containedSecondary", + "containedSizeLarge": "MuiButton-containedSizeLarge", + "containedSizeSmall": "MuiButton-containedSizeSmall", + "disableElevation": "MuiButton-disableElevation", + "disabled": "Mui-disabled", + "endIcon": "MuiButton-endIcon", + "focusVisible": "Mui-focusVisible", + "fullWidth": "MuiButton-fullWidth", + "iconSizeLarge": "MuiButton-iconSizeLarge", + "iconSizeMedium": "MuiButton-iconSizeMedium", + "iconSizeSmall": "MuiButton-iconSizeSmall", + "label": "MuiButton-label text-16-bold", + "outlined": "MuiButton-outlined", + "outlinedPrimary": "MuiButton-outlinedPrimary", + "outlinedSecondary": "MuiButton-outlinedSecondary", + "outlinedSizeLarge": "MuiButton-outlinedSizeLarge", + "outlinedSizeSmall": "MuiButton-outlinedSizeSmall", + "root": "MuiButton-root btn-highlight", + "sizeLarge": "MuiButton-sizeLarge", + "sizeSmall": "MuiButton-sizeSmall", + "startIcon": "MuiButton-startIcon", + "text": "MuiButton-text", + "textPrimary": "MuiButton-textPrimary", + "textSecondary": "MuiButton-textSecondary", + "textSizeLarge": "MuiButton-textSizeLarge", + "textSizeSmall": "MuiButton-textSizeSmall", + } + } + onClick={[Function]} + > + <WithStyles(ForwardRef(ButtonBase)) + aria-label="splashscreen.accessibility.button_reload" + className="MuiButton-root btn-highlight MuiButton-text splash-footer-button" + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <ForwardRef(ButtonBase) + aria-label="splashscreen.accessibility.button_reload" + className="MuiButton-root btn-highlight MuiButton-text splash-footer-button" + classes={ + Object { + "disabled": "Mui-disabled", + "focusVisible": "Mui-focusVisible", + "root": "MuiButtonBase-root", + } + } + component="button" + disabled={false} + focusRipple={true} + focusVisibleClassName="Mui-focusVisible" + onClick={[Function]} + type="button" + > + <button + aria-label="splashscreen.accessibility.button_reload" + className="MuiButtonBase-root MuiButton-root btn-highlight MuiButton-text splash-footer-button" + disabled={false} + onBlur={[Function]} + onClick={[Function]} + onDragLeave={[Function]} + onFocus={[Function]} + onKeyDown={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseLeave={[Function]} + onMouseUp={[Function]} + onTouchEnd={[Function]} + onTouchMove={[Function]} + onTouchStart={[Function]} + tabIndex={0} + type="button" + > + <span + className="MuiButton-label text-16-bold" + > + splashscreen.button_reload + </span> + <NoSsr> + <WithStyles(memo) + center={false} + > + <ForwardRef(TouchRipple) + center={false} + classes={ + Object { + "child": "MuiTouchRipple-child", + "childLeaving": "MuiTouchRipple-childLeaving", + "childPulsate": "MuiTouchRipple-childPulsate", + "ripple": "MuiTouchRipple-ripple", + "ripplePulsate": "MuiTouchRipple-ripplePulsate", + "rippleVisible": "MuiTouchRipple-rippleVisible", + "root": "MuiTouchRipple-root", + } + } + > + <span + className="MuiTouchRipple-root" + > + <TransitionGroup + childFactory={[Function]} + component={null} + exit={true} + /> + </span> + </ForwardRef(TouchRipple)> + </WithStyles(memo)> + </NoSsr> + </button> + </ForwardRef(ButtonBase)> + </WithStyles(ForwardRef(ButtonBase))> + </ForwardRef(Button)> </WithStyles(ForwardRef(Button))> </div> -</React.Fragment> +</SplashScreenError> `; diff --git a/src/components/Splash/splashScreen.scss b/src/components/Splash/splashScreen.scss index 60582eb874643e636f80a0e23b1803bf46875f3b..03d956ea9405064b6171368efab3e10d0ce7c273 100644 --- a/src/components/Splash/splashScreen.scss +++ b/src/components/Splash/splashScreen.scss @@ -4,20 +4,32 @@ display: flex; flex-direction: column; align-items: center; - justify-content: center; height: 100%; - &:first-child { - margin: auto; + .splash-loader { + width: 100%; + margin-top: 20vh; } .splash-logos-container { - align-self: flex-end; - margin-top: 3rem; + margin-top: auto; + margin-bottom: 1rem; width: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; } + .step-label { + margin: 1rem 0; + max-width: 350px; + color: white; + text-align: center; + height: 40px; + } + .splash-error-text { + text-align: center; + color: $red-primary; + margin: 0.5rem; + } } .splash-footer { display: flex; @@ -25,14 +37,63 @@ align-items: center; justify-content: flex-start; height: 10rem; - margin: 0 2rem; - .splash-footer-error-text { - text-align: center; - color: red; - margin: 0.5rem 0; - } + button.btn-highlight { - max-width: 50vw; + max-width: 230px; + width: 100%; margin: 0.5rem 0 0; + height: 40px; + } +} +.splash-progress { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + width: 100%; + margin: 1rem auto; + padding: 1rem; + transition: all 300ms ease; + border-radius: 12px; + box-sizing: border-box; + max-width: 350px; + + .splash-progress-bar-container { + flex: 1; + height: 10px; + background-image: linear-gradient( + 45deg, + #e3b82a 11.11%, + #1b1c22 11.11%, + #1b1c22 50%, + #e3b82a 50%, + #e3b82a 61.11%, + #1b1c22 61.11%, + #1b1c22 100% + ); + background-size: 9px 9px; + border: solid 1px $gold-shadow; + border-radius: 12px; + .splash-progress-bar-content { + height: 11px; + background-color: $gold-shadow; + border-radius: 12px 12px 0 12px; + transition: all 300ms ease; + position: relative; + overflow: hidden; + top: -1px; + left: -1px; + &:after { + content: ''; + position: absolute; + display: block; + transform: rotate(45deg); + background-color: $dark-2; + width: 15px; + height: 15px; + right: -9px; + top: -8px; + } + } } } diff --git a/src/components/TimeStepSelector/TimeStepSelector.tsx b/src/components/TimeStepSelector/TimeStepSelector.tsx index d6d9a715bba0c8a9668f5f878ada4b456f402cd3..27db0e30d8a475ce1cd80d00287f0e39b86c1593 100644 --- a/src/components/TimeStepSelector/TimeStepSelector.tsx +++ b/src/components/TimeStepSelector/TimeStepSelector.tsx @@ -51,9 +51,11 @@ const TimeStepSelector: React.FC<TimeStepSelectorProps> = ({ : [...timeStepMultiArray] const handleToday = () => { - const today = DateTime.local().setZone('utc', { - keepLocalTime: true, - }) + const today = DateTime.local() + .setZone('utc', { + keepLocalTime: true, + }) + .startOf('day') UsageEventService.addEvent(client, { type: UsageEventType.CONSUMPTION_CHANGE_TIMESTEP_EVENT, target: TimeStep[TimeStep.WEEK].toLowerCase(), diff --git a/src/components/TotalConsumption/TotalConsumption.spec.tsx b/src/components/TotalConsumption/TotalConsumption.spec.tsx index c5aa1270abe5361ffa6dfd22d39301f315252431..2d0f7e44959c60cc57f70512bfcaf54a777644c8 100644 --- a/src/components/TotalConsumption/TotalConsumption.spec.tsx +++ b/src/components/TotalConsumption/TotalConsumption.spec.tsx @@ -79,7 +79,7 @@ describe('TotalConsumption component', () => { .find('.euro-value') .first() .text() - ).toEqual('20,38') + ).toEqual('22,77') }) it('should format multifluid value', async () => { const component = mount( diff --git a/src/components/TotalConsumption/TotalConsumption.tsx b/src/components/TotalConsumption/TotalConsumption.tsx index 5c40c4833e5f340da4eb67b08e40f76bf3c8a942..53fcde843a814f94bb656306306725b15bc0ec68 100644 --- a/src/components/TotalConsumption/TotalConsumption.tsx +++ b/src/components/TotalConsumption/TotalConsumption.tsx @@ -42,8 +42,6 @@ const TotalConsumption: React.FC<TotalConsumptionProps> = ({ actualData.forEach(data => { if (data.value !== -1) { total += data.value - } - if (data.price) { totalPrice += converterService.LoadToEuro( data.value, fluidType, diff --git a/src/constants/config.json b/src/constants/config.json index d72bba6bcf30260ac6dcf84c9896b97eccd9f43e..74719b52c7278646b9367eda91cc48a933aad2f4 100644 --- a/src/constants/config.json +++ b/src/constants/config.json @@ -3,7 +3,7 @@ { "fluidTypeId": 0, "name": "enedis", - "coefficient": 0.1558, + "coefficient": 0.174, "startDate": "2021-08-01T00:00:00.000", "dataDelayOffset": 3, diff --git a/src/db/ecogestureData.json b/src/db/ecogestureData.json index 9be2b2271c7fc2275435096854ac03ea2d69d03e..272bb98c8d3d95b2bdf02047544610a9bb869676 100644 --- a/src/db/ecogestureData.json +++ b/src/db/ecogestureData.json @@ -770,7 +770,7 @@ "difficulty": 2, "room": [0], "season": "Eté", - "equipment": false, + "equipment": true, "equipmentType": ["AIR_CONDITIONING", "FAN"], "equipmentInstallation": true, "investment": null, @@ -793,7 +793,7 @@ "difficulty": 2, "room": [0], "season": "Eté", - "equipment": false, + "equipment": true, "equipmentType": ["AIR_CONDITIONING"], "equipmentInstallation": true, "investment": null, diff --git a/src/db/fluidPrices.json b/src/db/fluidPrices.json deleted file mode 100644 index 42e6b71677aa8a30bed782030b93ea8086041060..0000000000000000000000000000000000000000 --- a/src/db/fluidPrices.json +++ /dev/null @@ -1,500 +0,0 @@ -[ - { - "fluidType": 0, - "price": 0.1256, - "startDate": "2012-07-23T00:00:00.000Z", - "endDate": "2013-07-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.1329, - "startDate": "2013-08-01T00:00:00.000Z", - "endDate": "2014-10-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.1401, - "startDate": "2014-01-11T00:00:00.000Z", - "endDate": "2015-07-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.1437, - "startDate": "2015-08-01T00:00:00.000Z", - "endDate": "2016-07-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.1503, - "startDate": "2016-08-01T00:00:00.000Z", - "endDate": "2017-07-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.1546, - "startDate": "2017-08-01T00:00:00.000Z", - "endDate": "2018-01-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.1555, - "startDate": "2018-02-01T00:00:00.000Z", - "endDate": "2018-07-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.145, - "startDate": "2018-08-01T00:00:00.000Z", - "endDate": "2019-05-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.1531, - "startDate": "2019-06-01T00:00:00.000Z", - "endDate": "2019-07-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.1524, - "startDate": "2019-08-01T00:00:00.000Z", - "endDate": "2020-01-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.1546, - "startDate": "2020-02-01T00:00:00.000Z", - "endDate": "2020-07-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.1557, - "startDate": "2020-08-01T00:00:00.000Z", - "endDate": "2021-01-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.1582, - "startDate": "2021-02-01T00:00:00.000Z", - "endDate": "2021-07-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.1558, - "startDate": "2021-08-01T00:00:00.000Z", - "endDate": "2022-01-31T23:59:59.000Z" - }, - { - "fluidType": 0, - "price": 0.174, - "startDate": "2022-02-01T00:00:00.000Z", - "endDate": null - }, - { - "fluidType": 1, - "price": 0.0030735, - "startDate": "2012-01-01T00:00:00.000Z", - "endDate": "2012-12-31T23:59:59.000Z" - }, - { - "fluidType": 1, - "price": 0.0031483, - "startDate": "2013-01-01T00:00:00.000Z", - "endDate": "2013-12-31T23:59:59.000Z" - }, - { - "fluidType": 1, - "price": 0.0031381, - "startDate": "2014-01-01T00:00:00.000Z", - "endDate": "2014-12-31T23:59:59.000Z" - }, - { - "fluidType": 1, - "price": 0.00307, - "startDate": "2015-01-01T00:00:00.000Z", - "endDate": "2015-12-31T23:59:59.000Z" - }, - { - "fluidType": 1, - "price": 0.0031, - "startDate": "2016-01-01T00:00:00.000Z", - "endDate": "2016-12-31T23:59:59.000Z" - }, - { - "fluidType": 1, - "price": 0.00311, - "startDate": "2017-01-01T00:00:00.000Z", - "endDate": "2017-12-31T23:59:59.000Z" - }, - { - "fluidType": 1, - "price": 0.00313, - "startDate": "2018-01-01T00:00:00.000Z", - "endDate": "2018-12-31T23:59:59.000Z" - }, - { - "fluidType": 1, - "price": 0.00313, - "startDate": "2019-01-01T00:00:00.000Z", - "endDate": "2019-12-31T23:59:59.000Z" - }, - { - "fluidType": 1, - "price": 0.00315, - "startDate": "2020-01-01T00:00:00.000Z", - "endDate": "2020-12-31T23:59:59.000Z" - }, - { - "fluidType": 1, - "price": 0.00319, - "startDate": "2021-01-01T00:00:00.000Z", - "endDate": null - }, - { - "fluidType": 2, - "price": 0.0919, - "startDate": "2017-01-01T00:00:00.000Z", - "endDate": "2017-01-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0915, - "startDate": "2017-02-01T00:00:00.000Z", - "endDate": "2017-02-28T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0932, - "startDate": "2017-03-01T00:00:00.000Z", - "endDate": "2017-03-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0927, - "startDate": "2017-04-01T00:00:00.000Z", - "endDate": "2017-04-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0906, - "startDate": "2017-05-01T00:00:00.000Z", - "endDate": "2017-05-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0906, - "startDate": "2017-06-01T00:00:00.000Z", - "endDate": "2017-06-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0788, - "startDate": "2017-07-01T00:00:00.000Z", - "endDate": "2017-07-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0783, - "startDate": "2017-08-01T00:00:00.000Z", - "endDate": "2017-08-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0783, - "startDate": "2017-09-01T00:00:00.000Z", - "endDate": "2017-09-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0791, - "startDate": "2017-10-01T00:00:00.000Z", - "endDate": "2017-10-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0806, - "startDate": "2017-11-01T00:00:00.000Z", - "endDate": "2017-11-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0812, - "startDate": "2017-12-01T00:00:00.000Z", - "endDate": "2017-12-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0857, - "startDate": "2018-01-01T00:00:00.000Z", - "endDate": "2018-01-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0866, - "startDate": "2018-02-01T00:00:00.000Z", - "endDate": "2018-02-28T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0847, - "startDate": "2018-03-01T00:00:00.000Z", - "endDate": "2018-03-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0839, - "startDate": "2018-04-01T00:00:00.000Z", - "endDate": "2018-04-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0842, - "startDate": "2018-05-01T00:00:00.000Z", - "endDate": "2018-05-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0855, - "startDate": "2018-06-01T00:00:00.000Z", - "endDate": "2018-06-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0959, - "startDate": "2018-07-01T00:00:00.000Z", - "endDate": "2018-07-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0961, - "startDate": "2018-08-01T00:00:00.000Z", - "endDate": "2018-08-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0967, - "startDate": "2018-09-01T00:00:00.000Z", - "endDate": "2018-09-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0989, - "startDate": "2018-10-01T00:00:00.000Z", - "endDate": "2018-10-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.1031, - "startDate": "2018-11-01T00:00:00.000Z", - "endDate": "2018-11-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.1013, - "startDate": "2018-12-01T00:00:00.000Z", - "endDate": "2018-12-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0999, - "startDate": "2019-01-01T00:00:00.000Z", - "endDate": "2019-01-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0993, - "startDate": "2019-02-01T00:00:00.000Z", - "endDate": "2019-02-28T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0993, - "startDate": "2019-03-01T00:00:00.000Z", - "endDate": "2019-03-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0977, - "startDate": "2019-04-01T00:00:00.000Z", - "endDate": "2019-04-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0973, - "startDate": "2019-05-01T00:00:00.000Z", - "endDate": "2019-05-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0969, - "startDate": "2019-06-01T00:00:00.000Z", - "endDate": "2019-06-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0795, - "startDate": "2019-07-01T00:00:00.000Z", - "endDate": "2019-07-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0791, - "startDate": "2019-08-01T00:00:00.000Z", - "endDate": "2019-08-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0785, - "startDate": "2019-09-01T00:00:00.000Z", - "endDate": "2019-09-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.077, - "startDate": "2019-10-01T00:00:00.000Z", - "endDate": "2019-10-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0789, - "startDate": "2019-11-01T00:00:00.000Z", - "endDate": "2019-11-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0793, - "startDate": "2019-12-01T00:00:00.000Z", - "endDate": "2019-12-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0787, - "startDate": "2020-01-01T00:00:00.000Z", - "endDate": "2020-01-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0765, - "startDate": "2020-02-01T00:00:00.000Z", - "endDate": "2020-02-29T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0736, - "startDate": "2020-03-01T00:00:00.000Z", - "endDate": "2020-03-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.071, - "startDate": "2020-04-01T00:00:00.000Z", - "endDate": "2020-04-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0703, - "startDate": "2020-05-01T00:00:00.000Z", - "endDate": "2020-05-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0687, - "startDate": "2020-06-01T00:00:00.000Z", - "endDate": "2020-06-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0698, - "startDate": "2020-07-01T00:00:00.000Z", - "endDate": "2020-07-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0705, - "startDate": "2020-08-01T00:00:00.000Z", - "endDate": "2020-08-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0709, - "startDate": "2020-09-01T00:00:00.000Z", - "endDate": "2020-09-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0735, - "startDate": "2020-10-01T00:00:00.000Z", - "endDate": "2020-10-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0745, - "startDate": "2020-11-01T00:00:00.000Z", - "endDate": "2020-11-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0759, - "startDate": "2020-12-01T00:00:00.000Z", - "endDate": "2020-12-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.076, - "startDate": "2021-01-01T00:00:00.000Z", - "endDate": "2021-01-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0782, - "startDate": "2021-02-01T00:00:00.000Z", - "endDate": "2021-02-28T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0818, - "startDate": "2021-03-01T00:00:00.000Z", - "endDate": "2021-03-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.079, - "startDate": "2021-04-01T00:00:00.000Z", - "endDate": "2021-04-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0797, - "startDate": "2021-05-01T00:00:00.000Z", - "endDate": "2021-05-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0826, - "startDate": "2021-06-01T00:00:00.000Z", - "endDate": "2021-06-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0895, - "startDate": "2021-07-01T00:00:00.000Z", - "endDate": "2021-07-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.0934, - "startDate": "2021-08-01T00:00:00.000Z", - "endDate": "2021-08-31T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.1002, - "startDate": "2021-09-01T00:00:00.000Z", - "endDate": "2021-09-30T23:59:59.000Z" - }, - { - "fluidType": 2, - "price": 0.1121, - "startDate": "2021-10-01T00:00:00.000Z", - "endDate": null - } -] diff --git a/src/db/profileData.json b/src/db/profileData.json index 27e8408d285fc5f4fab68729f99cdcdd9fab3fe1..c8007e374da24d88f268e2cef270151303d72197 100644 --- a/src/db/profileData.json +++ b/src/db/profileData.json @@ -5,7 +5,6 @@ "mailToken": "", "duelHash": "", "quizHash": "", - "fluidPricesHash": "", "isFirstConnection": true, "lastConnectionDate": "0000-01-01T00:00:00.000Z", "haveSeenLastAnalysis": true, diff --git a/src/enum/dataload.enum.ts b/src/enum/dataload.enum.ts new file mode 100644 index 0000000000000000000000000000000000000000..0d98c473019ea842e4773e9e0b4f6bc840aab6aa --- /dev/null +++ b/src/enum/dataload.enum.ts @@ -0,0 +1,21 @@ +export enum DataloadState { + VALID = 'VALID', + EMPTY = 'EMPTY', + MISSING = 'MISSING', + HOLE = 'HOLE', + UPCOMING = 'UPCOMING', + COMING = 'COMING', + AGGREGATED_VALID = 'AGGREGATED_VALID', + AGGREGATED_EMPTY = 'AGGREGATED_EMPTY', + AGGREGATED_WITH_EMPTY = 'AGGREGATED_WITH_EMPTY', + AGGREGATED_HOLE_OR_MISSING = 'AGGREGATED_HOLE_OR_MISSING', + AGGREGATED_WITH_HOLE_OR_MISSING = 'AGGREGATED_WITH_HOLE_OR_MISSING', + AGGREGATED_WITH_COMING = 'AGGREGATED_WITH_UPCOMING', + AGGREGATED_COMING = 'AGGREGATED_COMING', +} + +export enum DataloadSectionType { + NO_COMPARE = 'NO_COMPARE', + LEFT = 'LEFT', + RIGHT = 'RIGHT', +} diff --git a/src/locales/fr.json b/src/locales/fr.json index c5fd454cb92a5e925d0efb516151bf2433cdb143..147c7f91e0e7ee29591a18e8bff438e811e59e41 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -287,6 +287,7 @@ "last_valid_data_multi": "Dernières données complètes", "data_to_come": "à venir", "aie": "Aïe !", + "data_empty": "Vide", "estimated": "estimés", "dataModal": { "list_title": "3 raisons possibles :", @@ -685,7 +686,8 @@ "error_no_login_password": "Identifiant et mot de passe requis", "error_login_failed": "Identifiants invalides", "error_update": "Un problème est survenu lors du rapatriement de vos données.", - "error_update_oauth": "Le service demande d'autoriser à nouveau votre accès. Merci de supprimer puis reconnecter votre compte. Aucune donnée ne sera perdue.", + "error_update_oauth": "Votre autorisation pour afficher vos données %{fluid} a expiré.", + "button_oauth_reload": "Redonner mon consentement", "OK": "Ok", "accessibility": { "button_install": "Installer le connecteur", @@ -731,6 +733,29 @@ "button_close": "Fermer la fenêtre" } }, + "consent_outdated": { + "title": { + "0": "Votre autorisation pour afficher vos données d’électricité a expiré", + "2": "Votre autorisation pour afficher vos données de gaz a expiré" + }, + "text1": { + "0": "Veuillez re-donner votre consentement pour la transmission et la reconnexion de vos données ENEDIS à Ecolyo.", + "2": "Veuillez re-donner votre accord pour que GRDF nous transmette vos données de consommation." + }, + "text2": { + "0": "Voulez-vous donner votre accord sur votre compte ENEDIS maintenant ?", + "2": "Voulez-vous donner votre accord sur votre compte GRDF maintenant ?" + }, + "later": "Plus tard", + "go": "J'y vais" + }, + "delete_grdf_modal": { + "text1": "La suppression de la connexion avec GRDF s’accompagne de la suppression de votre consentement à partager vos données gaz avec Ecolyo.", + "text2": "Si vous souhaitez vous reconnecter, il vous faudra re-donner votre accord pour que GRDF nous transmette vos données de consommation.", + "text3": "Voulez-vous supprimer votre connexion et votre consentement à GRDF ?", + "cancel": "Plus tard", + "go": "Oui" + }, "legal": { "read_legal": "Lire les mentions légales", "title_legal": "Mentions légales", @@ -1115,10 +1140,32 @@ } }, "splashscreen": { - "error_loading": "Erreur pendant le chargement des données. Veuillez vérifier votre connexion internet.", - "button_reload": "Recharger", + "error_loading": "Une erreur est survenue", + "button_reload": "Rééssayer", "accessibility": { "button_reload": "Recharger la page" + }, + "migration_error": "Mise à jour de l'application", + "consent_error": "Vérification de vos consentements pour partager vos données avec Ecolyo", + "profile_error": "Chargement de votre profil utilisateur", + "profileType_error": "Chargement de votre profil de consommation.", + "ecogesture_error": "Chargement de vos écogestes", + "challenges_error": "Actualisation de votre progression dans les défis", + "analysis_error": "Chargement de votre analyse mensuelle", + "index_error": "Chargement des index", + "prices_error": "Mise à jour des prix", + "consos_error": "Test de la connexion à vos données de consommation", + "partners_error": "Récupération de l'état des services partenaires", + "unknown_error": "Veuillez vérifier votre connexion internet", + "network_error": "Erreur de réseau", + "step": { + "0": "Mise à jour de l'application", + "1": "Vérification de vos consentements pour partager vos données avec Ecolyo", + "2": "Chargement de votre profil", + "3": "Chargement de vos écogestes", + "4": "Actualisation de votre progression dans les défis", + "5": "Mise à jour des prix", + "6": "Test de la connexion à vos données de consommation" } }, "timestep": { @@ -1126,19 +1173,26 @@ "activate": { "enedis": { "consent_active": { - "info": "Pour visualiser vos consommations à la 1/2 heure, il vous faut activer l’ENREGISTREMENT de votre consommation horaire sur votre compte Enedis", + "title": "La visualisation par 1/2 heure n’est pas activée", + "info": "Pour les visualiser, il vous faut activer l’<span>enregistrement</span> de votre consommation horaire sur votre compte Enedis", "label1": "Activer sur mon compte Enedis", "accessibility": { "button_activate": "Aller sur mon compte Enedis" } }, "no_consent_active": { + "title": "La visualisation par 1/2 heure n’est pas activée", "info": "Il semble que votre consentement ait expiré, il vous faut ré-activer l’enregistrement de votre consommation horaire sur votre compte Enedis", "label1": "Ré-activer sur mon compte Enedis", "accessibility": { "button_activate": "Aller sur mon compte Enedis" }, "text_analysis": "Pour bénéficier d’une analyse approfondie de votre consommation électrique, il vous faut activer l’enregistrement de votre consommation horaire sur votre compte Enedis" + }, + "consent_activated": { + "title": "La récupération de vos données s’effectuera cette nuit.", + "title_2": "À demain !", + "info": "Si vous n’avez pas réussi à activer l'enregistrement de votre consommation horaire, vous pouvez ré-essayer." } } }, diff --git a/src/migrations/migration.data.ts b/src/migrations/migration.data.ts index 1f4220283c7731f4701ac36e232de5d38816e1b8..c7c630402c728e3319766eac7d49a0ea8e193ead 100644 --- a/src/migrations/migration.data.ts +++ b/src/migrations/migration.data.ts @@ -516,4 +516,20 @@ export const migrations: Migration[] = [ return docs }, }, + { + baseSchemaVersion: 19, + targetSchemaVersion: 20, + appVersion: '1.8.0', + description: + 'Empty fluidPrices db so it can be fetched with right format from remote doctype', + releaseNotes: null, + docTypes: FLUIDPRICES_DOCTYPE, + run: async (_client: Client, docs: any[]): Promise<any> => { + docs.map(doc => { + doc.deleteAction = true + return doc + }) + return docs + }, + }, ] diff --git a/src/migrations/migration.service.ts b/src/migrations/migration.service.ts index 01c738c8d3a090f4803b27abcc02b7ec4d661eba..5d65dddbc2f7796e067b492a96957be7bfb34cde 100644 --- a/src/migrations/migration.service.ts +++ b/src/migrations/migration.service.ts @@ -7,12 +7,21 @@ import { } from './migration.data' import log from 'utils/logger' import { ReleaseNotes } from 'models/releaseNotes.model' +import { InitStepsErrors } from 'models/initialisationSteps.model' export class MigrationService { private readonly _client: Client - - constructor(_client: Client) { + private readonly _setinitStepError: React.Dispatch< + React.SetStateAction<InitStepsErrors | null> + > + constructor( + _client: Client, + _setinitStepError: React.Dispatch< + React.SetStateAction<InitStepsErrors | null> + > + ) { this._client = _client + this._setinitStepError = _setinitStepError } async runMigrations(migrations: Migration[]): Promise<ReleaseNotes> { @@ -38,9 +47,9 @@ export class MigrationService { if (migrationResult.type === MIGRATION_RESULT_FAILED) { // Retry in case of failure const result = await migrate(migration, this._client) - if (result.type === MIGRATION_RESULT_FAILED) { // Error in case of second failure + this._setinitStepError(InitStepsErrors.MIGRATION_ERROR) log.error(migrationLog(migration, result)) throw new Error() } else { diff --git a/src/models/dataload.model.ts b/src/models/dataload.model.ts index 9a2b157c3655b3c3a7a3583e092e5928563a8fc4..3f7f73b015d7674971456e33d8026d27ed8c1c4d 100644 --- a/src/models/dataload.model.ts +++ b/src/models/dataload.model.ts @@ -1,10 +1,17 @@ +import { DataloadState } from 'enum/dataload.enum' import { DateTime } from 'luxon' +export interface DataloadValueDetail { + value: number + state: DataloadState +} + export interface Dataload { date: DateTime value: number price?: number - valueDetail: number[] | null + state: DataloadState + valueDetail: DataloadValueDetail[] | null } export interface DataloadEntity { diff --git a/src/models/fluid.model.ts b/src/models/fluid.model.ts index 00077fcd16dd5a3131070c7a1895836d93f0a92c..812d6e59e61e2852b3f74c5d564fc32bcbbe87e5 100644 --- a/src/models/fluid.model.ts +++ b/src/models/fluid.model.ts @@ -15,6 +15,7 @@ export interface FluidConnection { export interface FluidStatus { fluidType: FluidType status: FluidState + firstDataDate: DateTime | null lastDataDate: DateTime | null connection: FluidConnection } diff --git a/src/models/fluidPrice.model.ts b/src/models/fluidPrice.model.ts index e1ca1fcf9692bf566c2934b93e7f7e380f96f7e4..97bd6227989362beaa68bace880b53aef498d3af 100644 --- a/src/models/fluidPrice.model.ts +++ b/src/models/fluidPrice.model.ts @@ -5,6 +5,7 @@ export interface FluidPrice { price: number startDate: string endDate: string + UpdatedAt?: string _id: string _rev?: string _type?: string diff --git a/src/models/global.model.ts b/src/models/global.model.ts index fe53a81b9f8f6cdcf8cfc385dea7bdb07766a8d8..afc5f92b5d4d8e15b44f06699755fa5c901afd3a 100644 --- a/src/models/global.model.ts +++ b/src/models/global.model.ts @@ -15,4 +15,5 @@ export interface GlobalState { fluidStatus: FluidStatus[] fluidTypes: FluidType[] openPartnersIssueModal: boolean + shouldRefreshConsent: boolean } diff --git a/src/models/initialisationSteps.model.ts b/src/models/initialisationSteps.model.ts new file mode 100644 index 0000000000000000000000000000000000000000..e139357efe2ce57f7e159f5c1abc6c87c5e8f61e --- /dev/null +++ b/src/models/initialisationSteps.model.ts @@ -0,0 +1,24 @@ +export enum InitSteps { + MIGRATION = 0, + CONSENT = 1, + PROFILE = 2, + ECOGESTURE = 3, + CHALLENGES = 4, + PRICES = 5, + CONSOS = 6, +} +export enum InitStepsErrors { + MIGRATION_ERROR = 'migration_error', + CONSENT_ERROR = 'consent_error', + PROFILE_ERROR = 'profile_error', + PROFILETYPE_ERROR = 'profileType_error', + ECOGESTURE_ERROR = 'ecogesture_error', + CHALLENGES_ERROR = 'challenges_error', + ANALYSIS_ERROR = 'analysis_error', + INDEX_ERROR = 'index_error', + PRICES_ERROR = 'prices_error', + CONSOS_ERROR = 'consos_error', + PARTNERS_ERROR = 'partners_error', + NETWORK_ERROR = 'network_error', + UNKNOWN_ERROR = 'unknown_error', +} diff --git a/src/models/monthlyReport.model.ts b/src/models/monthlyReport.model.ts index 0024938dbab9c8c83e5bae7ca22c76151dee85f0..c0699ca5210e4a1fa271a46192f0b88a24265282 100644 --- a/src/models/monthlyReport.model.ts +++ b/src/models/monthlyReport.model.ts @@ -1,6 +1,7 @@ -export interface MonthlReport { +export interface MonthlyReport { year: number month: number + subject: string image: string info: string newsTitle: string diff --git a/src/models/profile.model.ts b/src/models/profile.model.ts index 3073cdd0e0d4b82db6bb977153fb7567e70ba1e6..0a4b3e71219df3f233a5c2e7402a63e7e9f94d7f 100644 --- a/src/models/profile.model.ts +++ b/src/models/profile.model.ts @@ -11,7 +11,6 @@ export interface ProfileEntity { duelHash: string quizHash: string explorationHash: string - fluidPricesHash: string isFirstConnection: boolean lastConnectionDate: string haveSeenLastAnalysis: boolean @@ -25,6 +24,7 @@ export interface ProfileEntity { mailToken: string partnersIssueDate: string haveSeenEcogestureModal: boolean + activateHalfHourDate: string _id?: string _rev?: string } @@ -32,9 +32,13 @@ export interface ProfileEntity { export interface Profile extends Omit< ProfileEntity, - 'lastConnectionDate' | 'monthlyAnalysisDate' | 'partnersIssueDate' + | 'lastConnectionDate' + | 'monthlyAnalysisDate' + | 'partnersIssueDate' + | 'activateHalfHourDate' > { lastConnectionDate: DateTime monthlyAnalysisDate: DateTime partnersIssueDate: DateTime + activateHalfHourDate: DateTime } diff --git a/src/notifications/consumptionLimit.hbs b/src/notifications/consumptionLimit.hbs index e3bebd4ef0d68e73280143fc6e0c7cc408d017b0..ed7c16583805293713124d1eb2062f29d52961f0 100644 --- a/src/notifications/consumptionLimit.hbs +++ b/src/notifications/consumptionLimit.hbs @@ -9,10 +9,10 @@ <mj-section background-color="#121212"> <mj-column width="60%" vertical-align="middle"> - <mj-text color="white" font-weight="900" font-size="24px" font-family="Lato"> + <mj-text color="white" font-weight="900" font-size="24px"> Bonjour {{username}}, </mj-text> - <mj-text color="white" font-weight="400" font-size="18px" font-family="Lato"> + <mj-text color="white" font-weight="400" font-size="18px"> La limite de consommation d'eau journalière que vous avez fixée à {{userLimit}} L a été dépassée le {{limitDate}}.<br /> Pour comprendre ce qu’il s’est passé, rendez-vous dans Ecolyo. </mj-text> @@ -25,12 +25,12 @@ <mj-section background-color="#121212"> <mj-column> - <mj-social css-class="button-with-icon" icon-size="36px" mode="horizontal" font-size="20px" font-weight="700" font-family="Lato"> - <mj-social-element src="{{baseUrl}}/assets/ecolyo-icon.png" name="ecolyo" font-family="Lato" padding="0 10px 0 0" href="{{clientUrl}}"> + <mj-social css-class="button-with-icon" icon-size="36px" mode="horizontal" font-size="20px" font-weight="700"> + <mj-social-element src="{{baseUrl}}/assets/ecolyo-icon.png" name="ecolyo" padding="0 10px 0 0" href="{{clientUrl}}"> Voir dans Ecolyo </mj-social-element> </mj-social> - <mj-text color="white" font-weight="400" font-size="18px" align="center" font-family="Lato"> + <mj-text color="white" font-weight="400" font-size="18px" align="center"> Vous souhaitez modifier votre seuil d'alerte ou supprimer cette notification ? <a href="{{unsubscribeUrl}}" style="color: #E3B82A; font-weight: 900 !important;">C'est ici</a> </mj-text> </mj-column> diff --git a/src/notifications/monthlyReport.hbs b/src/notifications/monthlyReport.hbs index 0ed4363828c25b93ca5215b1256734d126e2aab6..fa907c871fb17b13aa4cc2d8bb413339f0e2ae8c 100644 --- a/src/notifications/monthlyReport.hbs +++ b/src/notifications/monthlyReport.hbs @@ -35,9 +35,9 @@ </mj-column> </mj-section> <mj-section background-color="#121212"> - <mj-text color="white" font-weight="400" font-size="18px">Retrouvez le détail de vos consommations et plus d'informations dans votre bilan Ecolyo.<br /><br /></mj-text> <mj-column> - <mj-social css-class="button-with-icon" icon-size="36px" mode="horizontal" font-size="20px" font-weight="700" > + <mj-text color="white" font-weight="400" font-size="18px">Retrouvez le détail de vos consommations et plus d'informations dans votre bilan Ecolyo.<br /><br /></mj-text> + <mj-social css-class="button-with-icon" icon-size="36px" mode="horizontal" font-size="20px" font-weight="700"> <mj-social-element src="{{baseUrl}}/assets/ecolyo-icon.png" name="ecolyo" padding="0 10px 0 0" href="{{clientUrl}}"> Voir mon bilan </mj-social-element> @@ -71,15 +71,15 @@ </mj-column> </mj-section> <mj-section background-color="#121212"> - <mj-column width="40%" vertical-align="middle"> + <mj-column vertical-align="middle"> <mj-image src={{feedbackImageUrl}} width="53px" 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> + <mj-text color="white" align="center" font-size="18px"> + N'hésitez pas à nous écrire via la bulle dans le service. + </mj-text> </mj-column> - <mj-text color="white" font-weight="900" align="center" font-size="18px"> - Un problème, une question, une suggestion ? - </mj-text> - <mj-text color="white" align="center" font-size="18px"> - N'hésitez pas à nous écrire via la bulle dans le service. - </mj-text> </mj-section> <mj-section background-color="black"> <mj-column> diff --git a/src/notifications/style.hbs b/src/notifications/style.hbs index e3eda4f4d1bf833aab71e90678bd58aa0889b6f5..69b682c0f1878c3f19e1fbfb24cc6d7acb59b755 100644 --- a/src/notifications/style.hbs +++ b/src/notifications/style.hbs @@ -20,7 +20,7 @@ table { background-color: #F1C017 !important; margin-left: 10px !important; margin-right: 10px !important; } .button-with-icon span { vertical-align: middle !important; } .button-with-icon a { vertical-align: middle !important; padding-right: 10px !important;} - .button-with-icon a img { padding-top: 20px;} + .button-with-icon a img { padding-top: 20px !important;} </mj-style> <mj-style> .custom-link a { color: #F1C017 !important; text-decoration: none !important; diff --git a/src/services/account.service.spec.ts b/src/services/account.service.spec.ts index 8b7b20c92c0d801afdce927308afcd192e56cd31..319d86144931e812fc47053dbcdfde031c945f3a 100644 --- a/src/services/account.service.spec.ts +++ b/src/services/account.service.spec.ts @@ -1,9 +1,11 @@ +/* eslint-disable @typescript-eslint/camelcase */ import { QueryResult } from 'cozy-client' import { AccountAuthData, Account } from 'models' import mockClient from '../../tests/__mocks__/client' import AccountService from './account.service' import { accountsData } from '../../tests/__mocks__/accountsData.mock' import { konnectorsData } from '../../tests/__mocks__/konnectorsData.mock' +import { triggersEnedisData } from '../../tests/__mocks__/triggersData.mock' jest.mock('cozy-harvest-lib/dist/connections/accounts') import * as harvestLibAccounts from 'cozy-harvest-lib/dist/connections/accounts' @@ -11,6 +13,15 @@ const mockHavestLibAccounts = harvestLibAccounts as jest.Mocked< typeof harvestLibAccounts > +const mockGetTriggerForAccount = jest.fn() +jest.mock('./triggers.service', () => { + return jest.fn(() => { + return { + getTriggerForAccount: mockGetTriggerForAccount, + } + }) +}) + describe('Account service', () => { const accountService = new AccountService(mockClient) @@ -74,6 +85,42 @@ describe('Account service', () => { const result = await accountService.getAccountByType(mockType) expect(result).toBe(null) }) + it('should return the account linked to oldest trigger when several account', async () => { + const mockType = 'enedisgrandlyon' + const mockAccounts = accountsData + mockAccounts[1].account_type = mockType + mockAccounts[2].account_type = mockType + const mockQueryResult: QueryResult<Account[]> = { + data: [...mockAccounts], + bookmark: '', + next: false, + skip: 0, + } + mockClient.query.mockResolvedValueOnce(mockQueryResult) + mockGetTriggerForAccount.mockResolvedValueOnce(triggersEnedisData[0]) + mockGetTriggerForAccount.mockResolvedValueOnce(triggersEnedisData[1]) + mockGetTriggerForAccount.mockResolvedValueOnce(triggersEnedisData[2]) + const result = await accountService.getAccountByType(mockType) + expect(result).toBe(mockAccounts[0]) + }) + }) + + describe('getAccountsByType method', () => { + it('should return all accounts for a type when several account', async () => { + const mockType = 'enedisgrandlyon' + const mockAccounts = accountsData + mockAccounts[1].account_type = mockType + mockAccounts[2].account_type = mockType + const mockQueryResult: QueryResult<Account[]> = { + data: [...mockAccounts], + bookmark: '', + next: false, + skip: 0, + } + mockClient.query.mockResolvedValueOnce(mockQueryResult) + const result = await accountService.getAccountsByType(mockType) + expect(result).toEqual(mockAccounts) + }) }) describe('updateAccount method', () => { diff --git a/src/services/account.service.ts b/src/services/account.service.ts index d750834626606b228a9dbd6dda292226c56c488b..e5845eb0aa8ccca35f14711fb8be6265d3b49e30 100644 --- a/src/services/account.service.ts +++ b/src/services/account.service.ts @@ -1,5 +1,11 @@ import { Client, QueryDefinition, Q, QueryResult } from 'cozy-client' -import { Account, AccountAttributes, AccountAuthData, Konnector } from 'models' +import { + Account, + AccountAttributes, + AccountAuthData, + Konnector, + Trigger, +} from 'models' import { ACCOUNTS_DOCTYPE } from 'doctypes' import { build } from 'cozy-harvest-lib/dist/helpers/accounts' import { @@ -8,6 +14,8 @@ import { deleteAccount, updateAccount, } from 'cozy-harvest-lib/dist/connections/accounts' +import TriggerService from './triggers.service' +import { DateTime } from 'luxon' export default class AccountService { private _client: Client @@ -48,11 +56,53 @@ export default class AccountService { const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) // eslint-disable-next-line @typescript-eslint/camelcase .where({ account_type: type }) - .limitBy(1) const { data: accounts }: QueryResult<Account[]> = await this._client.query( query ) - return accounts[0] ? accounts[0] : null + if (accounts.length > 1) { + // If several account are found we will used trigger date to select the older + const triggerService = new TriggerService(this._client) + const triggers: (Trigger | null)[] = await Promise.all( + accounts.map((_account: Account) => + triggerService.getTriggerForAccount(_account) + ) + ) + // Keep the accountid which have the older trigger + let olderDate: DateTime = DateTime.now() + let olderAccountId: string | null = null + for (const _trigger of triggers) { + if ( + _trigger && + _trigger.cozyMetadata && + _trigger.cozyMetadata.createdAt && + DateTime.fromISO(_trigger.cozyMetadata.createdAt, { + zone: 'utc', + }) < olderDate + ) { + olderDate = DateTime.fromISO(_trigger.cozyMetadata.createdAt, { + zone: 'utc', + }) + olderAccountId = _trigger.message.account + } + } + // Retrieve the accountId and return it + const filteredAccounts: Account[] = accounts.filter( + _account => _account._id === olderAccountId + ) + return filteredAccounts[0] ? filteredAccounts[0] : null + } else { + return accounts[0] ? accounts[0] : null + } + } + + public async getAccountsByType(type: string): Promise<Account[]> { + const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE) + // eslint-disable-next-line @typescript-eslint/camelcase + .where({ account_type: type }) + const { data: accounts }: QueryResult<Account[]> = await this._client.query( + query + ) + return accounts } public async updateAccount(account: Account): Promise<Account> { diff --git a/src/services/challenge.service.spec.ts b/src/services/challenge.service.spec.ts index 70ab9dec1bfc8022d5595674755ad41e3f768aeb..4af58ec04f0dbd6bd5ffb96797821ca051e22401 100644 --- a/src/services/challenge.service.spec.ts +++ b/src/services/challenge.service.spec.ts @@ -49,11 +49,11 @@ import { import { fluidStatusData } from '../../tests/__mocks__/fluidStatusData.mock' import { cloneDeep } from 'lodash' import { UserActionState } from 'enum/userAction.enum' +import { DataloadState } from 'enum/dataload.enum' const mockGetExplorationEntityById = jest.fn() const mockParseExplorationEntityToUserExploration = jest.fn() const mockGetUserExplorationfromExplorationEntities = jest.fn() - jest.mock('./exploration.service', () => { return jest.fn(() => { return { @@ -65,16 +65,25 @@ jest.mock('./exploration.service', () => { }) const mockGetGraphData = jest.fn() +const mockCalculatePerformanceIndicatorValue = jest.fn() jest.mock('./consumption.service', () => { return jest.fn(() => { return { getGraphData: mockGetGraphData, + calculatePerformanceIndicatorValue: mockCalculatePerformanceIndicatorValue, } }) }) describe('Challenge service', () => { const challengeService = new ChallengeService(mockClient) + beforeEach(() => { + mockGetExplorationEntityById.mockClear() + mockParseExplorationEntityToUserExploration.mockClear() + mockGetUserExplorationfromExplorationEntities.mockClear() + mockGetGraphData.mockClear() + mockCalculatePerformanceIndicatorValue.mockClear() + }) describe('unLockCurrentUserChallenge method', () => { it('should return all user challenge', () => { @@ -275,6 +284,45 @@ describe('Challenge service', () => { }) }) + describe('initChallengeDuelProgress method', () => { + it('should return updatedUserChallenge and dataload', async () => { + jest + .spyOn(challengeService, 'getUserChallengeDataload') + .mockResolvedValueOnce(graphData.actualData) + mockCalculatePerformanceIndicatorValue.mockResolvedValueOnce(130.83585) + const expectedUpdatedUserChallenge: UserChallenge = { + ...userChallengeData[0], + duel: { + ...userChallengeData[0].duel, + userConsumption: 130.83585, + }, + } + const mockQueryResult: QueryResult<UserChallenge> = { + data: expectedUpdatedUserChallenge, + bookmark: '', + next: false, + skip: 0, + } + mockClient.save.mockResolvedValue(mockQueryResult) + const expectedResult = { + updatedUserChallenge: expectedUpdatedUserChallenge, + dataloads: graphData.actualData, + } + const result = await challengeService.initChallengeDuelProgress( + userChallengeData[0] + ) + expect(result).toEqual(expectedResult) + }) + it('should throw an error because create failed', async () => { + mockClient.create.mockRejectedValue(new Error()) + try { + await challengeService.initChallengeDuelProgress(userChallengeData[0]) + } catch (error) { + expect(error).toEqual(new Error()) + } + }) + }) + describe('startUserChallenge method', () => { it('should return all UserChallenges Entities', async () => { const mockQueryResult: QueryResult<UserChallenge> = { @@ -402,10 +450,11 @@ describe('Challenge service', () => { }) .minus({ days: 5 }), value: 69.18029999999999, + state: DataloadState.AGGREGATED_VALID, valueDetail: [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, ], }, { @@ -415,10 +464,11 @@ describe('Challenge service', () => { }) .minus({ days: 4 }), value: 61.65554999999999, + state: DataloadState.AGGREGATED_VALID, valueDetail: [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + { value: 40.21918999999999, state: DataloadState.VALID }, + { value: 0.8064649999999999, state: DataloadState.VALID }, + { value: 20.629894999999998, state: DataloadState.VALID }, ], }, { @@ -428,7 +478,12 @@ describe('Challenge service', () => { }) .minus({ days: 3 }), value: 50.0, - valueDetail: [25.0, 5.0, 20.0], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 25.0, state: DataloadState.VALID }, + { value: 5.0, state: DataloadState.VALID }, + { value: 20.0, state: DataloadState.VALID }, + ], }, ] it('should return isDone = true, isWin = true and isEmpty=false when userConsumption < threshold', async () => { @@ -480,10 +535,11 @@ describe('Challenge service', () => { }) .minus({ days: 3 }), value: 69.18029999999999, + state: DataloadState.AGGREGATED_VALID, valueDetail: [ - 45.127739999999996, - 0.9048899999999999, - 23.147669999999998, + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, ], }, { @@ -493,10 +549,11 @@ describe('Challenge service', () => { }) .minus({ days: 2 }), value: 61.65554999999999, + state: DataloadState.AGGREGATED_VALID, valueDetail: [ - 40.21918999999999, - 0.8064649999999999, - 20.629894999999998, + { value: 40.21918999999999, state: DataloadState.VALID }, + { value: 0.8064649999999999, state: DataloadState.VALID }, + { value: 20.629894999999998, state: DataloadState.VALID }, ], }, { @@ -506,7 +563,12 @@ describe('Challenge service', () => { }) .minus({ days: 1 }), value: 50, - valueDetail: [25.0, 5.0, 20.0], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 25.0, state: DataloadState.VALID }, + { value: 5.0, state: DataloadState.VALID }, + { value: 20.0, state: DataloadState.VALID }, + ], }, ] it('should return isDone = true, isWin = true when all data are available and userConsumption < threshold', async () => { @@ -544,7 +606,11 @@ describe('Challenge service', () => { }) it('should return isDone = false and isWin = false when data in the middle is not available', async () => { const updatedDataloads = cloneDeep(dataloads) - updatedDataloads[1].valueDetail = [20.0, -1, 10.0] + updatedDataloads[1].valueDetail = [ + { value: 20.0, state: DataloadState.VALID }, + { value: -1, state: DataloadState.MISSING }, + { value: 10.0, state: DataloadState.VALID }, + ] const result = await challengeService.isChallengeDone( userChallenge, updatedDataloads diff --git a/src/services/challenge.service.ts b/src/services/challenge.service.ts index d6db954724fa9e4d3b2ca7bf738f6dbdd5769429..255e008f2a719ceccb7370a7f217bbba5fed2963 100644 --- a/src/services/challenge.service.ts +++ b/src/services/challenge.service.ts @@ -23,11 +23,10 @@ import { import { UserChallengeState, UserChallengeSuccess, + UserChallengeUpdateFlag, } from 'enum/userChallenge.enum' -import { UserChallengeUpdateFlag } from 'enum/userChallenge.enum' import { TimeStep } from 'enum/timeStep.enum' import { UserDuelState } from 'enum/userDuel.enum' - import DuelService from 'services/duel.service' import QuizService from 'services/quiz.service' import ConsumptionDataManager from 'services/consumption.service' @@ -38,6 +37,8 @@ import { FluidState, FluidType } from 'enum/fluid.enum' import { UserExplorationState } from 'enum/userExploration.enum' import { UserActionState } from 'enum/userAction.enum' import ActionService from './action.service' +import { getRoundFloat } from 'utils/math' + export default class ChallengeService { private readonly _client: Client @@ -493,6 +494,46 @@ export default class ChallengeService { return userChallenges } + /* + * Retrieve dataloads for ongoing duel + * sucess return: UserChallenge, Dataload[] + * failure throw error + */ + public async initChallengeDuelProgress( + userChallenge: UserChallenge + ): Promise<{ + updatedUserChallenge: UserChallenge + dataloads: Dataload[] + }> { + const consumptionService = new ConsumptionDataManager(this._client) + try { + const dataloads: Dataload[] = await this.getUserChallengeDataload( + userChallenge + ) + const userConsumption: number = getRoundFloat( + consumptionService.calculatePerformanceIndicatorValue(dataloads) + ) + const _userChallenge: UserChallenge = { + ...userChallenge, + duel: { + ...userChallenge.duel, + userConsumption: userConsumption, + }, + } + const updatedUserChallenge: UserChallenge = await this.updateUserChallenge( + _userChallenge, + UserChallengeUpdateFlag.DUEL_CONSUMPTION + ) + return { updatedUserChallenge, dataloads } + } catch (error) { + console.log( + 'Challenge service error on initChallengeDuelProgress : ', + error + ) + throw error + } + } + /** * Start UserChallenge and retrieve updated UserChallenge * @returns {UserChallenge} @@ -523,7 +564,7 @@ export default class ChallengeService { ) return updatedUserChallenge } catch (error) { - console.log('Initialization error: ', error) + console.log('Challenge service error on startUserChallenge : ', error) throw error } } @@ -759,6 +800,7 @@ export default class ChallengeService { TimeStep.DAY, userChallenge.duel.fluidTypes, undefined, + undefined, true ) if (dataChart) { @@ -823,7 +865,8 @@ export default class ChallengeService { dataloads.forEach((d: Dataload) => { if ( d.value === -1 || - (d.valueDetail && d.valueDetail.includes(-1)) + (d.valueDetail && + d.valueDetail.filter(data => data.value === -1).length > 0) ) { isDone = false } diff --git a/src/services/consumption.service.spec.ts b/src/services/consumption.service.spec.ts index 120fd6bee740232f84d1f69563f504487cf80d45..c5eb07f5317e169e5d690b18c6fc814c5d303ab0 100644 --- a/src/services/consumption.service.spec.ts +++ b/src/services/consumption.service.spec.ts @@ -3,15 +3,24 @@ import mockClient from '../../tests/__mocks__/client' import { TimeStep } from 'enum/timeStep.enum' import { DateTime } from 'luxon' import { FluidType } from 'enum/fluid.enum' -import { Dataload, DataloadEntity, FluidPrice, TimePeriod } from 'models' +import { + Datachart, + Dataload, + DataloadEntity, + FluidPrice, + FluidStatus, + TimePeriod, +} from 'models' import { ENEDIS_MINUTE_DOCTYPE } from 'doctypes' import { fluidPrices } from '../../tests/__mocks__/fluidPrice.mock' import { QueryResult } from 'cozy-client' import { loadDayData } from '../../tests/__mocks__/loadDayData.mock' -import { baseDataLoad } from '../../tests/__mocks__/datachartData.mock' +import { DataloadState } from 'enum/dataload.enum' +import { fluidStatusConnectedData } from '../../tests/__mocks__/fluidStatusData.mock' const mockFetchFluidData = jest.fn() const mockFetchFluidMaxData = jest.fn() +const mockGetFirstDateData = jest.fn() const mockGetLastDateData = jest.fn() const mockGetEntries = jest.fn() jest.mock('./queryRunner.service', () => { @@ -19,6 +28,7 @@ jest.mock('./queryRunner.service', () => { return { fetchFluidData: mockFetchFluidData, fetchFluidMaxData: mockFetchFluidMaxData, + getFirstDateData: mockGetFirstDateData, getLastDateData: mockGetLastDateData, getEntries: mockGetEntries, } @@ -27,85 +37,101 @@ jest.mock('./queryRunner.service', () => { describe('Consumption service', () => { const consumptionDataManager = new ConsumptionDataManager(mockClient) - let fluidTypes: FluidType[] = [0] + const fluidStatus: FluidStatus[] = fluidStatusConnectedData const mockTimePeriod: TimePeriod = { - startDate: DateTime.fromISO('2020-10-01T00:00:00.000Z'), - endDate: DateTime.fromISO('2020-10-03T23:59:59.999Z'), + startDate: DateTime.fromISO('2020-08-01T00:00:00.000Z'), + endDate: DateTime.fromISO('2020-08-03T23:59:59.999Z'), } const mockTimePeriodComparison: TimePeriod = { - startDate: DateTime.fromISO('2020-09-01T00:00:00.000Z'), - endDate: DateTime.fromISO('2020-09-03T23:59:59.999Z'), + startDate: DateTime.fromISO('2020-07-01T00:00:00.000Z'), + endDate: DateTime.fromISO('2020-07-03T23:59:59.999Z'), } const mockFetchDataActual: Dataload[] = [ { - date: DateTime.fromISO('2020-10-01T00:00:00.000Z'), + date: DateTime.fromISO('2020-08-01T00:00:00.000Z'), value: 291.9, + state: DataloadState.VALID, valueDetail: null, }, { - date: DateTime.fromISO('2020-10-02T00:00:00.000Z'), + date: DateTime.fromISO('2020-08-02T00:00:00.000Z'), value: 260.15, + state: DataloadState.VALID, valueDetail: null, }, ] const mockFetchDataComparison: Dataload[] = [ { - date: DateTime.fromISO('2020-09-01T00:00:00.000Z'), + date: DateTime.fromISO('2020-07-01T00:00:00.000Z'), value: 228.23, + state: DataloadState.VALID, valueDetail: null, }, { - date: DateTime.fromISO('2020-09-02T00:00:00.000Z'), + date: DateTime.fromISO('2020-07-02T00:00:00.000Z'), value: 238.71, + state: DataloadState.VALID, valueDetail: null, }, ] + describe('getGraphData method', () => { + beforeEach(() => { + mockFetchFluidData.mockClear() + }) it('should return null', async () => { const result = await consumptionDataManager.getGraphData( mockTimePeriod, TimeStep.DAY, [], + [], mockTimePeriodComparison, false ) expect(result).toBeNull() }) it('should return a mapped data for one fluid', async () => { + const fluidTypes: FluidType[] = [FluidType.ELECTRICITY] mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual) mockFetchFluidData.mockResolvedValueOnce(mockFetchDataComparison) - const mockResult = { + const mockResult: Datachart = { actualData: [ { - date: DateTime.fromISO('2020-10-01T00:00:00.000Z'), + date: DateTime.fromISO('2020-08-01T00:00:00.000Z'), value: 291.9, + state: DataloadState.VALID, valueDetail: null, }, { - date: DateTime.fromISO('2020-10-02T00:00:00.000Z'), + date: DateTime.fromISO('2020-08-02T00:00:00.000Z'), value: 260.15, + state: DataloadState.VALID, valueDetail: null, }, { - date: DateTime.fromISO('2020-10-03T00:00:00.000Z'), + date: DateTime.fromISO('2020-08-03T00:00:00.000Z'), value: -1, + state: DataloadState.HOLE, valueDetail: null, }, ], comparisonData: [ { - date: DateTime.fromISO('2020-09-01T00:00:00.000Z'), + date: DateTime.fromISO('2020-07-01T00:00:00.000Z'), value: 228.23, + state: DataloadState.VALID, valueDetail: null, }, { - date: DateTime.fromISO('2020-09-02T00:00:00.000Z'), + date: DateTime.fromISO('2020-07-02T00:00:00.000Z'), value: 238.71, + state: DataloadState.VALID, valueDetail: null, }, { - date: DateTime.fromISO('2020-09-03T00:00:00.000Z'), + date: DateTime.fromISO('2020-07-03T00:00:00.000Z'), value: -1, + state: DataloadState.HOLE, valueDetail: null, }, ], @@ -114,6 +140,7 @@ describe('Consumption service', () => { mockTimePeriod, TimeStep.DAY, fluidTypes, + fluidStatus, mockTimePeriodComparison, false ) @@ -121,44 +148,70 @@ describe('Consumption service', () => { }) it('should return a mapped data for multiple fluid', async () => { - fluidTypes = [0, 1, 2] - for (let i = 0; i < fluidTypes.length; i++) { + const fluidTypes: FluidType[] = [ + FluidType.ELECTRICITY, + FluidType.WATER, + FluidType.GAS, + ] + for (const fluidType of fluidTypes) { mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual) mockFetchFluidData.mockResolvedValueOnce(mockFetchDataComparison) } - const mockResult = { + const mockResult: Datachart = { actualData: [ { - date: DateTime.fromISO('2020-10-01T00:00:00.000Z'), - value: 79.131171, - valueDetail: [45.478019999999994, 0.931161, 32.72199], + date: DateTime.fromISO('2020-08-01T00:00:00.000Z'), + value: 84.44375099999999, + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 50.79059999999999, state: DataloadState.VALID }, + { value: 0.931161, state: DataloadState.VALID }, + { value: 32.72199, state: DataloadState.VALID }, + ], }, { - date: DateTime.fromISO('2020-10-02T00:00:00.000Z'), - value: 70.5240635, - valueDetail: [40.531369999999995, 0.8298785, 29.162815], + date: DateTime.fromISO('2020-08-02T00:00:00.000Z'), + value: 75.2587935, + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.266099999999994, state: DataloadState.VALID }, + { value: 0.8298785, state: DataloadState.VALID }, + { value: 29.162815, state: DataloadState.VALID }, + ], }, { - date: DateTime.fromISO('2020-10-03T00:00:00.000Z'), + date: DateTime.fromISO('2020-08-03T00:00:00.000Z'), value: -1, + state: DataloadState.AGGREGATED_HOLE_OR_MISSING, valueDetail: null, }, ], comparisonData: [ { - date: DateTime.fromISO('2020-09-01T00:00:00.000Z'), - value: 61.8708707, - valueDetail: [35.558234, 0.7280537, 25.584583], + date: DateTime.fromISO('2020-07-01T00:00:00.000Z'), + value: 66.0246567, + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 39.712019999999995, state: DataloadState.VALID }, + { value: 0.7280537, state: DataloadState.VALID }, + { value: 25.584583, state: DataloadState.VALID }, + ], }, { - date: DateTime.fromISO('2020-09-02T00:00:00.000Z'), - value: 64.7118939, - valueDetail: [37.191018, 0.7614849, 26.759391], + date: DateTime.fromISO('2020-07-02T00:00:00.000Z'), + value: 69.05641589999999, + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 41.53554, state: DataloadState.VALID }, + { value: 0.7614849, state: DataloadState.VALID }, + { value: 26.759391, state: DataloadState.VALID }, + ], }, { - date: DateTime.fromISO('2020-09-03T00:00:00.000Z'), + date: DateTime.fromISO('2020-07-03T00:00:00.000Z'), value: -1, + state: DataloadState.AGGREGATED_HOLE_OR_MISSING, valueDetail: null, }, ], @@ -167,75 +220,100 @@ describe('Consumption service', () => { mockTimePeriod, TimeStep.DAY, fluidTypes, + fluidStatus, mockTimePeriodComparison, true ) expect(result).toEqual(mockResult) }) - it('should return a mapped data for one fluid without comparison date', async () => { - const mockResult = { + it('should return a mapped data for multi fluid without comparison date', async () => { + const fluidTypes: FluidType[] = [ + FluidType.ELECTRICITY, + FluidType.WATER, + FluidType.GAS, + ] + const mockResult: Datachart = { actualData: [ { - date: DateTime.fromISO('2020-10-01T00:00:00.000Z'), - value: 79.131171, - valueDetail: [45.478019999999994, 0.931161, 32.72199], + date: DateTime.fromISO('2020-08-01T00:00:00.000Z'), + value: 84.44375099999999, + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 50.79059999999999, state: DataloadState.VALID }, + { value: 0.931161, state: DataloadState.VALID }, + { value: 32.72199, state: DataloadState.VALID }, + ], }, { - date: DateTime.fromISO('2020-10-02T00:00:00.000Z'), - value: 70.5240635, - valueDetail: [40.531369999999995, 0.8298785, 29.162815], + date: DateTime.fromISO('2020-08-02T00:00:00.000Z'), + value: 75.2587935, + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.266099999999994, state: DataloadState.VALID }, + { value: 0.8298785, state: DataloadState.VALID }, + { value: 29.162815, state: DataloadState.VALID }, + ], }, { - date: DateTime.fromISO('2020-10-03T00:00:00.000Z'), + date: DateTime.fromISO('2020-08-03T00:00:00.000Z'), value: -1, + state: DataloadState.AGGREGATED_HOLE_OR_MISSING, valueDetail: null, }, ], comparisonData: [], } - for (let i = 0; i < fluidTypes.length; i++) { - mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual) - } + mockFetchFluidData.mockResolvedValue(mockFetchDataActual) const result = await consumptionDataManager.getGraphData( mockTimePeriod, TimeStep.DAY, - fluidTypes + fluidTypes, + fluidStatus ) expect(result).toEqual(mockResult) }) it('should return null because of wrong parameters', async () => { - const mockFluidTypes = [1] + const fluidTypes = [FluidType.WATER] const result = await consumptionDataManager.getGraphData( mockTimePeriod, - TimeStep.DAY, - mockFluidTypes, + TimeStep.HALF_AN_HOUR, + fluidTypes, + fluidStatus, mockTimePeriodComparison, true ) expect(result).toBeNull() }) it('should return null because of timePeriod and comparaison', async () => { + const fluidTypes: FluidType[] = [FluidType.ELECTRICITY] const wrongTimePeriod = { - startDate: DateTime.fromISO('2020-10-03T23:59:59.999Z'), - endDate: DateTime.fromISO('2020-10-01T00:00:00.000Z'), + startDate: DateTime.fromISO('2020-08-03T23:59:59.999Z'), + endDate: DateTime.fromISO('2020-08-01T00:00:00.000Z'), } const result = await consumptionDataManager.getGraphData( wrongTimePeriod, TimeStep.DAY, fluidTypes, + fluidStatus, mockTimePeriodComparison, true ) expect(result).toBeNull() }) }) + describe('getMaxLoad method', () => { it('should return the maxed value for a time period for the home', async () => { - for (let i = 0; i < fluidTypes.length; i++) { + const fluidTypes: FluidType[] = [ + FluidType.ELECTRICITY, + FluidType.WATER, + FluidType.GAS, + ] + for (const fluidtype of fluidTypes) { mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual) mockFetchFluidData.mockResolvedValueOnce(mockFetchDataComparison) } - const expectedResult = 79.131171 + const expectedResult = 84.44375099999999 const result = await consumptionDataManager.getMaxLoad( mockTimePeriod, TimeStep.DAY, @@ -246,21 +324,27 @@ describe('Consumption service', () => { expect(result).toEqual(expectedResult) }) it('should return the maxed value for a time period', async () => { - const mockFluidTypes = [1] + const fluidTypes: FluidType[] = [FluidType.ELECTRICITY] const expectedResult = 63.1254 mockFetchFluidMaxData.mockResolvedValueOnce(expectedResult) const result = await consumptionDataManager.getMaxLoad( mockTimePeriod, TimeStep.DAY, - mockFluidTypes, + fluidTypes, mockTimePeriodComparison, false ) expect(result).toEqual(expectedResult) }) }) + describe('getPerformanceIndicators method', () => { it('should return the performance indicator', async () => { + const fluidTypes: FluidType[] = [ + FluidType.ELECTRICITY, + FluidType.WATER, + FluidType.GAS, + ] mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual) mockFetchFluidData.mockResolvedValueOnce(mockFetchDataComparison) mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual) @@ -268,24 +352,24 @@ describe('Consumption service', () => { //Incomplete Data to test all possibilities mockFetchFluidData.mockResolvedValueOnce([ { - date: DateTime.fromISO('2020-10-01T00:23:20.000Z'), + date: DateTime.fromISO('2020-08-01T00:23:20.000Z'), value: 298.283, }, ]) mockFetchFluidData.mockResolvedValueOnce([ { - date: DateTime.fromISO('2020-10-01T03:10:00.000Z'), + date: DateTime.fromISO('2020-08-01T03:10:00.000Z'), value: 398.283, }, ]) const mockTimePeriodComplete = { - startDate: DateTime.fromISO('2020-10-01T00:00:00.000Z'), - endDate: DateTime.fromISO('2020-10-02T23:59:59.999Z'), + startDate: DateTime.fromISO('2020-08-01T00:00:00.000Z'), + endDate: DateTime.fromISO('2020-08-02T23:59:59.999Z'), } const mockTimePeriodComparisonComplete = { - startDate: DateTime.fromISO('2020-09-01T00:00:00.000Z'), - endDate: DateTime.fromISO('2020-09-02T23:59:59.999Z'), + startDate: DateTime.fromISO('2020-07-01T00:00:00.000Z'), + endDate: DateTime.fromISO('2020-07-02T23:59:59.999Z'), } const expectedResult = [ { @@ -316,63 +400,64 @@ describe('Consumption service', () => { expect(result).toEqual(expectedResult) }) }) - describe('fetchLastDateData method', () => { + + describe('fetchAllFirstDateData method', () => { it('should return the latest date data of one fluid', async () => { - const mockFluidTypes = [0] - const expectedResult = DateTime.fromISO('2020-09-03T23:59:59.999Z') - mockGetLastDateData.mockResolvedValueOnce( - DateTime.fromISO('2020-09-03T23:59:59.999Z') - ) - const result = await consumptionDataManager.fetchLastDateData( - mockFluidTypes - ) - expect(result).toEqual(expectedResult) - }) - it('should return the latest date data of multiple fluid', async () => { - const mockFluidTypes = [0, 2] - mockGetLastDateData.mockResolvedValueOnce( + const fluidTypes: FluidType[] = [FluidType.ELECTRICITY] + const expectedResult = [DateTime.fromISO('2020-09-03T23:59:59.999Z')] + mockGetFirstDateData.mockResolvedValueOnce( DateTime.fromISO('2020-09-03T23:59:59.999Z') ) - mockGetLastDateData.mockResolvedValueOnce( - DateTime.fromISO('2020-09-02T23:59:59.999Z') - ) - const expectedResult = DateTime.fromISO('2020-09-03T23:59:59.999Z') - const result = await consumptionDataManager.fetchLastDateData( - mockFluidTypes + const result = await consumptionDataManager.fetchAllFirstDateData( + fluidTypes ) expect(result).toEqual(expectedResult) }) - it('should return the latest date data of all fluids', async () => { - mockGetLastDateData.mockResolvedValueOnce( + it('should return the latest date data of All fluid', async () => { + const fluidTypes: FluidType[] = [ + FluidType.ELECTRICITY, + FluidType.WATER, + FluidType.GAS, + ] + mockGetFirstDateData.mockResolvedValueOnce( DateTime.fromISO('2020-09-02T23:59:59.999Z') ) - mockGetLastDateData.mockResolvedValueOnce( + mockGetFirstDateData.mockResolvedValueOnce( DateTime.fromISO('2020-09-03T23:59:59.999Z') ) - mockGetLastDateData.mockResolvedValueOnce( + mockGetFirstDateData.mockResolvedValueOnce( DateTime.fromISO('2020-09-01T23:59:59.999Z') ) - const expectedResult = DateTime.fromISO('2020-09-01T23:59:59.999Z') - const result = await consumptionDataManager.fetchLastDateData( - fluidTypes, - true + const expectedResult = [ + DateTime.fromISO('2020-09-02T23:59:59.999Z'), + DateTime.fromISO('2020-09-03T23:59:59.999Z'), + DateTime.fromISO('2020-09-01T23:59:59.999Z'), + ] + const result = await consumptionDataManager.fetchAllFirstDateData( + fluidTypes ) expect(result).toEqual(expectedResult) }) }) + describe('fetchAllLastDateData method', () => { it('should return the latest date data of one fluid', async () => { - const mockFluidTypes = [0] + const fluidTypes: FluidType[] = [FluidType.ELECTRICITY] const expectedResult = [DateTime.fromISO('2020-09-03T23:59:59.999Z')] mockGetLastDateData.mockResolvedValueOnce( DateTime.fromISO('2020-09-03T23:59:59.999Z') ) const result = await consumptionDataManager.fetchAllLastDateData( - mockFluidTypes + fluidTypes ) expect(result).toEqual(expectedResult) }) it('should return the latest date data of All fluid', async () => { + const fluidTypes: FluidType[] = [ + FluidType.ELECTRICITY, + FluidType.WATER, + FluidType.GAS, + ] mockGetLastDateData.mockResolvedValueOnce( DateTime.fromISO('2020-09-02T23:59:59.999Z') ) @@ -393,9 +478,10 @@ describe('Consumption service', () => { expect(result).toEqual(expectedResult) }) }) + describe('checkDoctypeEntries method', () => { it('should return a boolean if doctype are correct', async () => { - let fluidType = 2 + let fluidType: FluidType = FluidType.GAS mockGetEntries.mockResolvedValueOnce({ data: [1] }) let result = await consumptionDataManager.checkDoctypeEntries( fluidType, @@ -411,6 +497,7 @@ describe('Consumption service', () => { expect(result).toBeFalsy() }) }) + describe('getFirstDataDateFromDoctypeWithPrice', () => { it('should Get the first entry of a given data doctype', async () => { const data: QueryResult<FluidPrice[]> = { @@ -427,6 +514,7 @@ describe('Consumption service', () => { expect(result).toEqual(data.data[0]) }) }) + describe('getLastHourData', () => { it('should get last hour data', async () => { const mockQueryResult: QueryResult<DataloadEntity[]> = { @@ -445,6 +533,7 @@ describe('Consumption service', () => { expect(result.length).toEqual(1) }) }) + describe('saveDoc & saveDocs', () => { it('should saveDoc', async () => { const mockQueryResult: QueryResult<DataloadEntity> = { diff --git a/src/services/consumption.service.ts b/src/services/consumption.service.ts index f4648871f87b478f026b2b71a3ae636835d473a3..107b36b21b472a9de08e267d02466a27b8d771eb 100644 --- a/src/services/consumption.service.ts +++ b/src/services/consumption.service.ts @@ -6,6 +6,8 @@ import { Datachart, Dataload, DataloadEntity, + DataloadValueDetail, + FluidStatus, PerformanceIndicator, TimePeriod, } from 'models' @@ -16,6 +18,7 @@ import ConverterService from 'services/converter.service' import { ENEDIS_MINUTE_DOCTYPE } from 'doctypes' import { Doctype } from 'cozy-client/types/types' import { EnedisMonthlyAnalysisData } from 'models/enedisMonthlyAnalysis' +import { DataloadState } from 'enum/dataload.enum' // eslint-disable-next-line @typescript-eslint/interface-name-prefix export interface ISingleFluidChartData { @@ -41,6 +44,7 @@ export default class ConsumptionDataManager { * @param timePeriod TimePeriod * @param timeStep TimeStep * @param fluidTypes FluidType[] + * @param fluidStatus FluidStatus[] * @param compareTimePeriod - Optional TimePeriod * @param isHome - Optional boolean * @returns DataChart | null @@ -49,6 +53,7 @@ export default class ConsumptionDataManager { timePeriod: TimePeriod, timeStep: TimeStep, fluidTypes: FluidType[], + fluidStatus?: FluidStatus[], compareTimePeriod?: TimePeriod, isHome?: boolean ): Promise<Datachart | null> { @@ -60,23 +65,23 @@ export default class ConsumptionDataManager { ) if (!InputisValid) return null if (fluidTypes.length === 1 && !isHome) { - //TODO validating input data - //TODO applying buisness logic to the query arguments - + const fluidType: FluidType = fluidTypes[0] // running the query - const fetchedData = await this.fetchSingleFluidGraphData( + const fetchedData: Datachart | null = await this.fetchSingleFluidGraphData( timePeriod, timeStep, - fluidTypes[0], + fluidType, compareTimePeriod ) // formatting data - const formattedData = this.formatGraphDataManage( + const formattedData: Datachart | null = this.formatGraphDataManager( fetchedData, timeStep, timePeriod, - compareTimePeriod || null + compareTimePeriod || null, + fluidType, + fluidStatus ? fluidStatus[fluidType] : undefined ) return formattedData } else if (fluidTypes.length > 1 || isHome) { @@ -89,11 +94,13 @@ export default class ConsumptionDataManager { compareTimePeriod ) // formatting data - const formattedData = this.formatGraphDataManage( + const formattedData = this.formatGraphDataManager( fetchedData, timeStep, timePeriod, - compareTimePeriod || null + compareTimePeriod || null, + fluidType, + fluidStatus ? fluidStatus[fluidType] : undefined ) // validating output data toBeAgreggatedData.push({ @@ -101,8 +108,9 @@ export default class ConsumptionDataManager { chartFluid: fluidType, }) } - const aggregatedData = this.aggregateGraphData(toBeAgreggatedData) - + const aggregatedData: Datachart | null = this.aggregateGraphData( + toBeAgreggatedData + ) return aggregatedData } else return null } @@ -121,15 +129,13 @@ export default class ConsumptionDataManager { maxTimePeriod, timeStep, fluidTypes, + undefined, compareMaxTimePeriod, isHome ) - const max = - allData && allData.actualData - ? Math.max(...allData.actualData.map(d => d.value)) - : 0 - - return max + return allData && allData.actualData + ? Math.max(...allData.actualData.map(d => d.value)) + : 0 } else { const max = await this._queryRunnerService.fetchFluidMaxData( maxTimePeriod, @@ -166,14 +172,13 @@ export default class ConsumptionDataManager { fluidTypes: FluidType[], compareTimePeriod?: TimePeriod ): Promise<PerformanceIndicator[]> { - //const result = {}; const performanceIndicators: PerformanceIndicator[] = [] - - for (const fluideType of fluidTypes) { + for (const fluidType of fluidTypes) { const graphData: Datachart | null = await this.getGraphData( timePeriod, timeStep, - [fluideType], + [fluidType], + undefined, compareTimePeriod ) @@ -214,7 +219,7 @@ export default class ConsumptionDataManager { ) } - performanceIndicators[fluideType] = performanceIndicator + performanceIndicators[fluidType] = performanceIndicator } } @@ -235,7 +240,7 @@ export default class ConsumptionDataManager { } public calculatePerformanceIndicatorPrice(data: Dataload[]): number { - return data.reduce((a, b) => (b.price !== null ? a + b.price : a), 0) + return data.reduce((a, b) => (b.price ? a + b.price : a), 0) } private calculatePerformanceIndicatorVariationPercentage( @@ -287,18 +292,22 @@ export default class ConsumptionDataManager { return singleFluidGraphData } - private formatGraphDataManage( + private formatGraphDataManager( data: Datachart | null, timeStep: TimeStep, timePeriod: TimePeriod, - compareTimePeriod: TimePeriod | null + compareTimePeriod: TimePeriod | null, + fluidType: FluidType, + fluidStatus?: FluidStatus ): Datachart | null { if (!data) return null const formattedActualData: Dataload[] = this._consumptionFormatterService.formatGraphData( data.actualData, timePeriod, - timeStep + timeStep, + fluidType, + fluidStatus ) let formattedComparisonData: Dataload[] | null = null @@ -306,7 +315,9 @@ export default class ConsumptionDataManager { formattedComparisonData = this._consumptionFormatterService.formatGraphData( data.comparisonData ? data.comparisonData : [], compareTimePeriod, - timeStep + timeStep, + fluidType, + fluidStatus ) const result: Datachart = { @@ -317,40 +328,23 @@ export default class ConsumptionDataManager { return result } - public async fetchLastDateData( - fluidTypes: FluidType[], - allFluids?: boolean - ): Promise<DateTime | null> { - let lastDay = null + public async fetchAllFirstDateData( + fluidTypes: FluidType[] + ): Promise<(DateTime | null)[]> { + let firstDay = null + const firstDays = [] if (fluidTypes.length === 1) { - lastDay = - (await this._queryRunnerService.getLastDateData(fluidTypes[0])) || null + firstDay = + (await this._queryRunnerService.getFirstDateData(fluidTypes[0])) || null + firstDays.push(firstDay) } else if (fluidTypes.length > 1) { - const lastDays = [] for (const fluidType of fluidTypes) { - lastDay = - (await this._queryRunnerService.getLastDateData(fluidType)) || null - - if (lastDay) { - lastDays.push(lastDay) - } - } - if (lastDays.length < 1) { - return null - } - if (allFluids) { - lastDay = lastDays.reduce(function(a, b) { - return a < b ? a : b - }) - } else { - lastDay = lastDays.reduce(function(a, b) { - return a > b ? a : b - }) + firstDay = + (await this._queryRunnerService.getFirstDateData(fluidType)) || null + firstDays.push(firstDay) } } - //validate input - // validate output - return lastDay + return firstDays } public async fetchAllLastDateData( @@ -428,16 +422,22 @@ export default class ConsumptionDataManager { let agreggatedConvertedValue = 0 let comparisonAgreggatedConvertedValue = 0 + const tempAggregatedState: DataloadState[] = [] + const tempComparisonAggregatedState: DataloadState[] = [] + let noDataCount = 0 let comparisonNoDataCount = 0 - const convertedValueDetail = [] - const comparisonConvertedValueDetail = [] + const convertedValueDetail: DataloadValueDetail[] = [] + const comparisonConvertedValueDetail: DataloadValueDetail[] = [] for (const singleFluidChart of singleFluidCharts) { if (!singleFluidChart.chartData) break if (!singleFluidChart.chartData.actualData[i]) break const value = singleFluidChart.chartData.actualData[i].value + tempAggregatedState.push( + singleFluidChart.chartData.actualData[i].state + ) let convertedValue = -1 if (value === -1) noDataCount++ @@ -450,7 +450,10 @@ export default class ConsumptionDataManager { agreggatedConvertedValue += convertedValue } - convertedValueDetail[singleFluidChart.chartFluid] = convertedValue + convertedValueDetail[singleFluidChart.chartFluid] = { + value: convertedValue, + state: singleFluidChart.chartData.actualData[i].state, + } if ( singleFluidChart.chartData.comparisonData && @@ -458,6 +461,9 @@ export default class ConsumptionDataManager { ) { const comparisonValue = singleFluidChart.chartData.comparisonData[i].value + tempComparisonAggregatedState.push( + singleFluidChart.chartData.comparisonData[i].state + ) let convertedComparisonValue = -1 if (comparisonValue === -1) comparisonNoDataCount++ @@ -470,9 +476,10 @@ export default class ConsumptionDataManager { comparisonAgreggatedConvertedValue += convertedComparisonValue } - comparisonConvertedValueDetail[ - singleFluidChart.chartFluid - ] = convertedComparisonValue + comparisonConvertedValueDetail[singleFluidChart.chartFluid] = { + value: convertedComparisonValue, + state: singleFluidChart.chartData.comparisonData[i].state, + } } } @@ -482,9 +489,14 @@ export default class ConsumptionDataManager { comparisonAgreggatedConvertedValue = -1 if (singleFluidCharts[0].chartData.actualData[i]) { + // Define the aggregated state + const aggregatedDataloadState: DataloadState = this._consumptionFormatterService.defineAggregatedDataloadState( + tempAggregatedState + ) const acutaldataLoad: Dataload = { date: singleFluidCharts[0].chartData.actualData[i].date, value: agreggatedConvertedValue, + state: aggregatedDataloadState, valueDetail: agreggatedConvertedValue === -1 ? null : convertedValueDetail, } @@ -496,9 +508,14 @@ export default class ConsumptionDataManager { resultChartData.comparisonData && singleFluidCharts[0].chartData.comparisonData[i] ) { + // Define the aggregated state + const aggregatedComparisonDataloadState: DataloadState = this._consumptionFormatterService.defineAggregatedDataloadState( + tempComparisonAggregatedState + ) const comparisondataLoad: Dataload = { date: singleFluidCharts[0].chartData.comparisonData[i].date, value: comparisonAgreggatedConvertedValue, + state: aggregatedComparisonDataloadState, valueDetail: comparisonAgreggatedConvertedValue === -1 ? null diff --git a/src/services/consumptionFormatter.service.spec.ts b/src/services/consumptionFormatter.service.spec.ts index 420129fa314891de5e828bc567d9ecf52bdcfb89..2a27a7681dbc113401dd445e7a8bfb16bc103d22 100644 --- a/src/services/consumptionFormatter.service.spec.ts +++ b/src/services/consumptionFormatter.service.spec.ts @@ -1,7 +1,12 @@ import ConsumptionFormatterService from './consumptionFormatter.service' import { TimeStep } from 'enum/timeStep.enum' import { DateTime } from 'luxon' -import { Dataload, TimePeriod } from 'models' +import { Dataload, FluidStatus, TimePeriod } from 'models' +import { DataloadState } from 'enum/dataload.enum' +import { FluidType } from 'enum/fluid.enum' +import { fluidStatusConnectedData } from '../../tests/__mocks__/fluidStatusData.mock' + +const localSpy = jest.spyOn(DateTime, 'local') const mockDataLoad: Dataload[] = [ { @@ -9,6 +14,7 @@ const mockDataLoad: Dataload[] = [ zone: 'utc', }), value: 291.9, + state: DataloadState.VALID, valueDetail: null, }, { @@ -16,6 +22,7 @@ const mockDataLoad: Dataload[] = [ zone: 'utc', }), value: 235.5, + state: DataloadState.VALID, valueDetail: null, }, { @@ -23,6 +30,7 @@ const mockDataLoad: Dataload[] = [ zone: 'utc', }), value: 260.15, + state: DataloadState.VALID, valueDetail: null, }, { @@ -30,6 +38,7 @@ const mockDataLoad: Dataload[] = [ zone: 'utc', }), value: 293.33, + state: DataloadState.VALID, valueDetail: null, }, { @@ -37,6 +46,7 @@ const mockDataLoad: Dataload[] = [ zone: 'utc', }), value: 268.55, + state: DataloadState.VALID, valueDetail: null, }, { @@ -44,6 +54,7 @@ const mockDataLoad: Dataload[] = [ zone: 'utc', }), value: 272.33, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -56,16 +67,30 @@ let mockTimePeriod: TimePeriod = { }), } const unknowTimeStep = 999 + describe('ConsumptionFormatter service', () => { const consumptionFormatterService = new ConsumptionFormatterService() + const fluidStatus: FluidStatus[] = fluidStatusConnectedData + + beforeEach(() => { + localSpy.mockClear() + fluidStatus[FluidType.ELECTRICITY].firstDataDate = null + fluidStatus[FluidType.ELECTRICITY].lastDataDate = null + fluidStatus[FluidType.WATER].firstDataDate = null + fluidStatus[FluidType.WATER].lastDataDate = null + fluidStatus[FluidType.GAS].firstDataDate = null + fluidStatus[FluidType.GAS].firstDataDate = null + }) + describe('formatGraphData method', () => { it('should return a formattedData for DAY', () => { - const mockResult = [ + const mockResult: Dataload[] = [ { date: DateTime.fromISO('2020-10-01T00:00:00.000Z', { zone: 'utc', }), value: 291.9, + state: DataloadState.VALID, valueDetail: null, }, { @@ -73,6 +98,7 @@ describe('ConsumptionFormatter service', () => { zone: 'utc', }), value: -1, + state: DataloadState.EMPTY, valueDetail: null, }, { @@ -80,13 +106,16 @@ describe('ConsumptionFormatter service', () => { zone: 'utc', }), value: 260.15, + state: DataloadState.VALID, valueDetail: null, }, ] const result = consumptionFormatterService.formatGraphData( mockDataLoad, mockTimePeriod, - TimeStep.DAY + TimeStep.DAY, + FluidType.ELECTRICITY, + fluidStatus[FluidType.ELECTRICITY] ) expect(result).toEqual(mockResult) }) @@ -99,13 +128,13 @@ describe('ConsumptionFormatter service', () => { zone: 'utc', }), } - const mockResult = [ { date: DateTime.fromISO('2020-10-01T00:00:00.000Z', { zone: 'utc', }), value: 291.9, + state: DataloadState.VALID, valueDetail: null, }, { @@ -113,6 +142,7 @@ describe('ConsumptionFormatter service', () => { zone: 'utc', }), value: 235.5, + state: DataloadState.VALID, valueDetail: null, }, { @@ -120,13 +150,16 @@ describe('ConsumptionFormatter service', () => { zone: 'utc', }), value: -1, + state: DataloadState.EMPTY, valueDetail: null, }, ] const result = consumptionFormatterService.formatGraphData( mockDataLoad, mockTimePeriod, - TimeStep.HALF_AN_HOUR + TimeStep.HALF_AN_HOUR, + FluidType.ELECTRICITY, + fluidStatus[FluidType.ELECTRICITY] ) expect(result).toEqual(mockResult) }) @@ -139,13 +172,13 @@ describe('ConsumptionFormatter service', () => { zone: 'utc', }), } - const mockResult = [ { date: DateTime.fromISO('2020-10-01T00:00:00.000Z', { zone: 'utc', }), value: 291.9, + state: DataloadState.VALID, valueDetail: null, }, { @@ -153,6 +186,7 @@ describe('ConsumptionFormatter service', () => { zone: 'utc', }), value: 268.55, + state: DataloadState.VALID, valueDetail: null, }, { @@ -160,13 +194,16 @@ describe('ConsumptionFormatter service', () => { zone: 'utc', }), value: -1, + state: DataloadState.EMPTY, valueDetail: null, }, ] const result = consumptionFormatterService.formatGraphData( mockDataLoad, mockTimePeriod, - TimeStep.MONTH + TimeStep.MONTH, + FluidType.ELECTRICITY, + fluidStatus[FluidType.ELECTRICITY] ) expect(result).toEqual(mockResult) }) @@ -179,13 +216,13 @@ describe('ConsumptionFormatter service', () => { zone: 'utc', }), } - const mockResult = [ { date: DateTime.fromISO('2018-11-03T20:59:59.999Z', { zone: 'utc', }), value: 272.33, + state: DataloadState.VALID, valueDetail: null, }, { @@ -193,6 +230,7 @@ describe('ConsumptionFormatter service', () => { zone: 'utc', }), value: -1, + state: DataloadState.EMPTY, valueDetail: null, }, { @@ -200,13 +238,16 @@ describe('ConsumptionFormatter service', () => { zone: 'utc', }), value: 291.9, + state: DataloadState.VALID, valueDetail: null, }, ] const result = consumptionFormatterService.formatGraphData( mockDataLoad, mockTimePeriod, - TimeStep.YEAR + TimeStep.YEAR, + FluidType.ELECTRICITY, + fluidStatus[FluidType.ELECTRICITY] ) expect(result).toEqual(mockResult) }) @@ -215,11 +256,495 @@ describe('ConsumptionFormatter service', () => { consumptionFormatterService.formatGraphData( mockDataLoad, mockTimePeriod, - unknowTimeStep + unknowTimeStep, + FluidType.ELECTRICITY, + fluidStatus[FluidType.ELECTRICITY] ) } catch (error) { expect(error).toEqual(new Error('TimeStep unknown')) } }) }) + + describe('defineDataloadState method', () => { + const mockData: Dataload = { + date: DateTime.fromISO('2020-10-01T00:00:00.000Z', { + zone: 'utc', + }), + value: 291.9, + state: DataloadState.VALID, + valueDetail: null, + } + const mockEmptyData: Dataload = { + date: DateTime.fromISO('2020-10-01T00:00:00.000Z', { + zone: 'utc', + }), + value: -1, + state: DataloadState.EMPTY, + valueDetail: null, + } + it('sould return not change state because data date < today and no firstFluidDataDate & no lastFluidDataDate', () => { + const expectedResult: Dataload = mockData + const result: Dataload = consumptionFormatterService.defineDataloadState( + mockData, + FluidType.ELECTRICITY, + TimeStep.DAY, + fluidStatus[FluidType.ELECTRICITY] + ) + expect(result).toEqual(expectedResult) + }) + it('sould return COMING state because data date >= today', () => { + localSpy.mockReturnValueOnce( + DateTime.fromISO('2020-10-01T00:00:00.000Z', { zone: 'utc' }) + ) + const expectedResult: Dataload = { + ...mockData, + state: DataloadState.COMING, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + mockData, + FluidType.ELECTRICITY, + TimeStep.DAY, + fluidStatus[FluidType.ELECTRICITY] + ) + expect(result).toEqual(expectedResult) + }) + it('sould return EMPTY state because data.date < firstFluidDataDate for day timestep', () => { + fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO( + '2020-10-20T00:00:00.000Z', + { + zone: 'utc', + } + ) + const expectedResult: Dataload = { + ...mockData, + state: DataloadState.EMPTY, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + mockData, + FluidType.ELECTRICITY, + TimeStep.DAY, + fluidStatus[FluidType.ELECTRICITY] + ) + expect(result).toEqual(expectedResult) + }) + it('sould return EMPTY state because data.date < start of month of firstFluidDataDate for month timestep', () => { + fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO( + '2020-11-01T00:00:00.000Z', + { + zone: 'utc', + } + ) + const expectedResult: Dataload = { + ...mockData, + state: DataloadState.EMPTY, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + mockData, + FluidType.ELECTRICITY, + TimeStep.MONTH, + fluidStatus[FluidType.ELECTRICITY] + ) + expect(result).toEqual(expectedResult) + }) + it('sould return EMPTY state because data.date < start of year firstFluidDataDate for year timestep', () => { + fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO( + '2021-10-20T00:00:00.000Z', + { + zone: 'utc', + } + ) + const expectedResult: Dataload = { + ...mockData, + state: DataloadState.EMPTY, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + mockData, + FluidType.ELECTRICITY, + TimeStep.YEAR, + fluidStatus[FluidType.ELECTRICITY] + ) + expect(result).toEqual(expectedResult) + }) + it('sould return VALID state because data.date < firstFluidDataDate for month timestep', () => { + fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO( + '2020-10-20T00:00:00.000Z', + { + zone: 'utc', + } + ) + const expectedResult: Dataload = { + ...mockData, + state: DataloadState.VALID, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + mockData, + FluidType.ELECTRICITY, + TimeStep.MONTH, + fluidStatus[FluidType.ELECTRICITY] + ) + expect(result).toEqual(expectedResult) + }) + it('sould return VALID state because data.date < firstFluidDataDate for year timestep', () => { + fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO( + '2020-12-20T00:00:00.000Z', + { + zone: 'utc', + } + ) + const expectedResult: Dataload = { + ...mockData, + state: DataloadState.VALID, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + mockData, + FluidType.ELECTRICITY, + TimeStep.YEAR, + fluidStatus[FluidType.ELECTRICITY] + ) + expect(result).toEqual(expectedResult) + }) + it('sould return HOLE state because data.date between firstFluidDataDate and lastFluidDataDate and value is -1', () => { + fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO( + '2020-08-01T00:00:00.000Z', + { + zone: 'utc', + } + ) + fluidStatus[FluidType.ELECTRICITY].lastDataDate = DateTime.fromISO( + '2020-12-01T00:00:00.000Z', + { + zone: 'utc', + } + ) + const expectedResult: Dataload = { + ...mockEmptyData, + state: DataloadState.HOLE, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + mockEmptyData, + FluidType.ELECTRICITY, + TimeStep.DAY, + fluidStatus[FluidType.ELECTRICITY] + ) + expect(result).toEqual(expectedResult) + }) + it('sould return VALID state because data.date between firstFluidDataDate and lastFluidDataDate and value is -1', () => { + fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO( + '2020-08-01T00:00:00.000Z', + { + zone: 'utc', + } + ) + fluidStatus[FluidType.ELECTRICITY].lastDataDate = DateTime.fromISO( + '2020-12-01T00:00:00.000Z', + { + zone: 'utc', + } + ) + const expectedResult: Dataload = { + ...mockData, + state: DataloadState.VALID, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + mockData, + FluidType.ELECTRICITY, + TimeStep.DAY, + fluidStatus[FluidType.ELECTRICITY] + ) + expect(result).toEqual(expectedResult) + }) + + describe('sould return COMING state because data.date > lastFluidDataDate and is in dataDelayOffset period', () => { + beforeEach(() => { + fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO( + '2020-08-01T00:00:00.000Z', + { + zone: 'utc', + } + ) + fluidStatus[FluidType.ELECTRICITY].lastDataDate = DateTime.fromISO( + '2020-09-30T00:00:00.000Z', + { + zone: 'utc', + } + ) + fluidStatus[FluidType.WATER].firstDataDate = DateTime.fromISO( + '2020-08-01T00:00:00.000Z', + { + zone: 'utc', + } + ) + fluidStatus[FluidType.WATER].lastDataDate = DateTime.fromISO( + '2020-09-30T00:00:00.000Z', + { + zone: 'utc', + } + ) + fluidStatus[FluidType.GAS].firstDataDate = DateTime.fromISO( + '2020-08-01T00:00:00.000Z', + { + zone: 'utc', + } + ) + fluidStatus[FluidType.GAS].lastDataDate = DateTime.fromISO( + '2020-09-30T00:00:00.000Z', + { + zone: 'utc', + } + ) + }) + const today = DateTime.local().setZone('utc', { + keepLocalTime: true, + }) + it('case ELECTRICITY with date >= today-3', () => { + const data: Dataload = { + ...mockEmptyData, + date: today.minus({ day: 3 }), + } + const expectedResult: Dataload = { + ...data, + state: DataloadState.COMING, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + data, + FluidType.ELECTRICITY, + TimeStep.DAY, + fluidStatus[FluidType.ELECTRICITY] + ) + expect(result).toEqual(expectedResult) + }) + it('case GAS with date >= today-5', () => { + const data: Dataload = { + ...mockEmptyData, + date: today.minus({ day: 5 }), + } + const expectedResult: Dataload = { + ...data, + state: DataloadState.COMING, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + data, + FluidType.GAS, + TimeStep.DAY, + fluidStatus[FluidType.GAS] + ) + expect(result).toEqual(expectedResult) + }) + it('case WATER with date >= today-5', () => { + const data: Dataload = { + ...mockEmptyData, + date: today.minus({ day: 5 }), + } + const expectedResult: Dataload = { + ...data, + state: DataloadState.COMING, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + data, + FluidType.WATER, + TimeStep.DAY, + fluidStatus[FluidType.WATER] + ) + expect(result).toEqual(expectedResult) + }) + }) + + describe('sould return MISSING state because data.date > lastFluidDataDate and is not in dataDelayOffset period', () => { + beforeEach(() => { + fluidStatus[FluidType.ELECTRICITY].firstDataDate = DateTime.fromISO( + '2019-08-01T00:00:00.000Z', + { + zone: 'utc', + } + ) + fluidStatus[FluidType.ELECTRICITY].lastDataDate = DateTime.fromISO( + '2020-09-30T00:00:00.000Z', + { + zone: 'utc', + } + ) + fluidStatus[FluidType.WATER].firstDataDate = DateTime.fromISO( + '2019-08-01T00:00:00.000Z', + { + zone: 'utc', + } + ) + fluidStatus[FluidType.WATER].lastDataDate = DateTime.fromISO( + '2020-09-30T00:00:00.000Z', + { + zone: 'utc', + } + ) + fluidStatus[FluidType.GAS].firstDataDate = DateTime.fromISO( + '2019-08-01T00:00:00.000Z', + { + zone: 'utc', + } + ) + fluidStatus[FluidType.GAS].lastDataDate = DateTime.fromISO( + '2020-09-30T00:00:00.000Z', + { + zone: 'utc', + } + ) + }) + const today = DateTime.local().setZone('utc', { + keepLocalTime: true, + }) + it('case ELECTRICITY with date <= today-3', () => { + const data: Dataload = { + ...mockEmptyData, + date: today.minus({ day: 4 }), + } + const expectedResult: Dataload = { + ...data, + state: DataloadState.MISSING, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + data, + FluidType.ELECTRICITY, + TimeStep.DAY, + fluidStatus[FluidType.ELECTRICITY] + ) + expect(result).toEqual(expectedResult) + }) + it('case GAS with date <= today-5', () => { + const data: Dataload = { + ...mockEmptyData, + date: today.minus({ day: 6 }), + } + const expectedResult: Dataload = { + ...data, + state: DataloadState.MISSING, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + data, + FluidType.GAS, + TimeStep.DAY, + fluidStatus[FluidType.GAS] + ) + expect(result).toEqual(expectedResult) + }) + it('case WATER with date <= today-5', () => { + const data: Dataload = { + ...mockEmptyData, + date: today.minus({ day: 6 }), + } + const expectedResult: Dataload = { + ...data, + state: DataloadState.MISSING, + } + const result: Dataload = consumptionFormatterService.defineDataloadState( + data, + FluidType.WATER, + TimeStep.DAY, + fluidStatus[FluidType.WATER] + ) + expect(result).toEqual(expectedResult) + }) + }) + }) + + describe('defineAggregatedDataloadState method', () => { + it('should return AGGREGATED_WITH_HOLE_OR_MISSING because of HOLE data', () => { + const dataloadStateArray: DataloadState[] = [ + DataloadState.VALID, + DataloadState.HOLE, + DataloadState.VALID, + ] + const result: DataloadState = consumptionFormatterService.defineAggregatedDataloadState( + dataloadStateArray + ) + expect(result).toEqual(DataloadState.AGGREGATED_WITH_HOLE_OR_MISSING) + }) + it('should return AGGREGATED_WITH_HOLE_OR_MISSING because of MISSING data', () => { + const dataloadStateArray: DataloadState[] = [ + DataloadState.VALID, + DataloadState.MISSING, + DataloadState.VALID, + ] + const result: DataloadState = consumptionFormatterService.defineAggregatedDataloadState( + dataloadStateArray + ) + expect(result).toEqual(DataloadState.AGGREGATED_WITH_HOLE_OR_MISSING) + }) + it('should return AGGREGATED_WITH_COMING because of UPCOMING data', () => { + const dataloadStateArray: DataloadState[] = [ + DataloadState.VALID, + DataloadState.UPCOMING, + DataloadState.VALID, + ] + const result: DataloadState = consumptionFormatterService.defineAggregatedDataloadState( + dataloadStateArray + ) + expect(result).toEqual(DataloadState.AGGREGATED_WITH_COMING) + }) + it('should return AGGREGATED_WITH_COMING because of COMING data', () => { + const dataloadStateArray: DataloadState[] = [ + DataloadState.VALID, + DataloadState.COMING, + DataloadState.VALID, + ] + const result: DataloadState = consumptionFormatterService.defineAggregatedDataloadState( + dataloadStateArray + ) + expect(result).toEqual(DataloadState.AGGREGATED_WITH_COMING) + }) + it('should return AGGREGATED_WITH_EMPTY because of EMPTY data', () => { + const dataloadStateArray: DataloadState[] = [ + DataloadState.VALID, + DataloadState.EMPTY, + DataloadState.VALID, + ] + const result: DataloadState = consumptionFormatterService.defineAggregatedDataloadState( + dataloadStateArray + ) + expect(result).toEqual(DataloadState.AGGREGATED_WITH_EMPTY) + }) + it('should return AGGREGATED_VALID', () => { + const dataloadStateArray: DataloadState[] = [ + DataloadState.VALID, + DataloadState.VALID, + DataloadState.VALID, + ] + const result: DataloadState = consumptionFormatterService.defineAggregatedDataloadState( + dataloadStateArray + ) + expect(result).toEqual(DataloadState.AGGREGATED_VALID) + }) + it('should return AGGREGATED_HOLE_OR_MISSING', () => { + const dataloadStateArray: DataloadState[] = [ + DataloadState.HOLE, + DataloadState.MISSING, + DataloadState.MISSING, + ] + const result: DataloadState = consumptionFormatterService.defineAggregatedDataloadState( + dataloadStateArray + ) + expect(result).toEqual(DataloadState.AGGREGATED_HOLE_OR_MISSING) + }) + it('should return AGGREGATED_COMING', () => { + const dataloadStateArray: DataloadState[] = [ + DataloadState.UPCOMING, + DataloadState.COMING, + DataloadState.COMING, + ] + const result: DataloadState = consumptionFormatterService.defineAggregatedDataloadState( + dataloadStateArray + ) + expect(result).toEqual(DataloadState.AGGREGATED_COMING) + }) + it('should return AGGREGATED_EMPTY', () => { + const dataloadStateArray: DataloadState[] = [ + DataloadState.EMPTY, + DataloadState.EMPTY, + DataloadState.EMPTY, + ] + const result: DataloadState = consumptionFormatterService.defineAggregatedDataloadState( + dataloadStateArray + ) + expect(result).toEqual(DataloadState.AGGREGATED_EMPTY) + }) + }) }) diff --git a/src/services/consumptionFormatter.service.ts b/src/services/consumptionFormatter.service.ts index 9a7504c54b5c1282a8289e51dcb3c62a95cbe5ac..1ca49c7e29637e2c516d7a80aad990348fb6a63d 100644 --- a/src/services/consumptionFormatter.service.ts +++ b/src/services/consumptionFormatter.service.ts @@ -1,51 +1,190 @@ /* eslint-disable @typescript-eslint/interface-name-prefix */ +import { DataloadState } from 'enum/dataload.enum' +import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' -import { Dataload, TimePeriod } from 'models' +import { DateTime, Interval } from 'luxon' +import { Dataload, FluidStatus, TimePeriod } from 'models' import DateChartService from 'services/dateChart.service' import { compareDates } from 'utils/date' +import ConfigService from './fluidConfig.service' export default class ConsumptionFormatterService { public formatGraphData( data: Dataload[], timePeriod: TimePeriod, - timeStep: TimeStep + timeStep: TimeStep, + fluidType: FluidType, + fluidStatus?: FluidStatus ): Dataload[] { + // Sort data data.sort((dataA, dataB) => compareDates(dataA.date, dataB.date)) - const formattedData = this.fillMissingData(data, timePeriod, timeStep) - - // complete missing data within data - - return formattedData - } - - private fillMissingData( - data: Dataload[], - timePeriod: TimePeriod, - timeStep: TimeStep - ): Dataload[] { + // Set status of data and complete missing/empty data const filledData = [] let parsingDate = timePeriod.startDate const dateChartService = new DateChartService() while (parsingDate <= timePeriod.endDate) { - //const filtereddata = data.filter(dt => dt.date.equals(parsingDate)) const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate) ) - const newElement = filtereddata[0] - ? filtereddata[0] - : { - date: parsingDate, - value: -1, - } - filledData.push({ ...newElement, valueDetail: null }) + const newElement: Dataload = this.defineDataloadState( + filtereddata[0] + ? filtereddata[0] + : { + date: parsingDate, + value: -1, + state: DataloadState.EMPTY, + valueDetail: null, + }, + fluidType, + timeStep, + fluidStatus + ) + filledData.push({ ...newElement }) parsingDate = parsingDate.plus(this.getTimeFromStepTime(timeStep)) } return filledData } + public defineDataloadState( + data: Dataload, + fluidType: FluidType, + timeStep: TimeStep, + fluidStatus?: FluidStatus + ): Dataload { + const today = DateTime.local().setZone('utc', { + keepLocalTime: true, + }) + // Return coming state if data data is >= today + if (data.date >= today) { + return { ...data, state: DataloadState.COMING } + } + if (!fluidStatus) { + return data + } + // Define state in function of first and last fluid data date + if ( + fluidStatus.firstDataDate && + timeStep !== TimeStep.MONTH && + timeStep !== TimeStep.YEAR && + data.date < fluidStatus.firstDataDate + ) { + return { ...data, state: DataloadState.EMPTY } + } + if ( + fluidStatus.firstDataDate && + timeStep === TimeStep.MONTH && + data.date < fluidStatus.firstDataDate.startOf('month') + ) { + return { ...data, state: DataloadState.EMPTY } + } + if ( + fluidStatus.firstDataDate && + timeStep === TimeStep.YEAR && + data.date < fluidStatus.firstDataDate.startOf('year') + ) { + return { ...data, state: DataloadState.EMPTY } + } + if (fluidStatus.lastDataDate && data.date > fluidStatus.lastDataDate) { + const isDataToCome: boolean = this.isDataToCome(data, fluidType) + return { + ...data, + state: isDataToCome ? DataloadState.COMING : DataloadState.MISSING, + } + } + if ( + fluidStatus.firstDataDate && + fluidStatus.lastDataDate && + data.date >= fluidStatus.firstDataDate && + data.date <= fluidStatus.lastDataDate + ) { + return { + ...data, + state: data.value === -1 ? DataloadState.HOLE : DataloadState.VALID, + } + } + return data + } + + private isDataToCome(dataload: Dataload, fluidType: FluidType): boolean { + const configService = new ConfigService() + const fluidConfig = configService.getFluidConfig() + + const inter = Interval.fromDateTimes( + dataload.date.startOf('day'), + DateTime.local() + .setZone('utc', { + keepLocalTime: true, + }) + .startOf('day') + ).count('days') + if ( + fluidType === FluidType.ELECTRICITY && + inter <= fluidConfig[0].dataDelayOffset + 1 + ) { + return true + } + if ( + fluidType === FluidType.WATER && + inter <= fluidConfig[1].dataDelayOffset + 1 + ) { + return true + } + if ( + fluidType === FluidType.GAS && + inter <= fluidConfig[2].dataDelayOffset + 1 + ) { + return true + } else { + return false + } + } + + public defineAggregatedDataloadState( + dataloadStateArray: DataloadState[] + ): DataloadState { + if (dataloadStateArray.includes(DataloadState.VALID)) { + if ( + dataloadStateArray.includes(DataloadState.HOLE) || + dataloadStateArray.includes(DataloadState.MISSING) + ) { + return DataloadState.AGGREGATED_WITH_HOLE_OR_MISSING + } + if ( + dataloadStateArray.includes(DataloadState.UPCOMING) || + dataloadStateArray.includes(DataloadState.COMING) + ) { + return DataloadState.AGGREGATED_WITH_COMING + } + if (dataloadStateArray.includes(DataloadState.EMPTY)) { + return DataloadState.AGGREGATED_WITH_EMPTY + } + return DataloadState.AGGREGATED_VALID + } + // No valid data but at least one hole or missing data + if ( + dataloadStateArray.includes(DataloadState.HOLE) || + dataloadStateArray.includes(DataloadState.MISSING) + ) { + return DataloadState.AGGREGATED_HOLE_OR_MISSING + } + // No valid data but at least one upcoming or coming data + if ( + dataloadStateArray.includes(DataloadState.UPCOMING) || + dataloadStateArray.includes(DataloadState.COMING) + ) { + return DataloadState.AGGREGATED_COMING + } + // No valid data but at least one empty data + if (dataloadStateArray.includes(DataloadState.EMPTY)) { + return DataloadState.AGGREGATED_EMPTY + } + // Default + return DataloadState.AGGREGATED_VALID + } + private getTimeFromStepTime(timeStep: TimeStep) { switch (timeStep) { case TimeStep.HALF_AN_HOUR: diff --git a/src/services/dateChart.service.spec.ts b/src/services/dateChart.service.spec.ts index 606c816f635dcb58bc4e5caeb1c0e834397e49d9..e78e403999fb843c453cfec1ac720fd9fd19825e 100644 --- a/src/services/dateChart.service.spec.ts +++ b/src/services/dateChart.service.spec.ts @@ -1,8 +1,7 @@ import DateChartService from './dateChart.service' import { TimeStep } from 'enum/timeStep.enum' import { DateTime } from 'luxon' -import { Dataload, TimePeriod } from 'models' -import { FluidType } from 'enum/fluid.enum' +import { TimePeriod } from 'models' const localSpy = jest.spyOn(DateTime, 'local') @@ -1292,77 +1291,4 @@ describe('dateChart service', () => { expect(result).toEqual(0) }) }) - - describe('isDataToCome method', () => { - const dateChartService = new DateChartService() - const today = DateTime.local().setZone('utc', { - keepLocalTime: true, - }) - - it('should return true for electricity fluidType and dataLoad with date < today-1', () => { - const dataLoad: Dataload = { - date: today, - value: 0, - valueDetail: null, - } - const result = dateChartService.isDataToCome( - dataLoad, - FluidType.ELECTRICITY - ) - expect(result).toBe(true) - }) - - it('should return false for electricity fluidType and dataLoad with date > J+3', () => { - const dataLoad: Dataload = { - date: today.plus({ day: -4 }), - value: 0, - valueDetail: null, - } - const result = dateChartService.isDataToCome( - dataLoad, - FluidType.ELECTRICITY - ) - expect(result).toBe(false) - }) - - it('should return true for gaz fluidType and dataLoad with date < today-2', () => { - const dataLoad: Dataload = { - date: today.plus({ day: -1 }), - value: 0, - valueDetail: null, - } - const result = dateChartService.isDataToCome(dataLoad, FluidType.GAS) - expect(result).toBe(true) - }) - - it('should return false for gaz fluidType and dataLoad with date > J+5', () => { - const dataLoad: Dataload = { - date: today.plus({ day: -6 }), - value: 0, - valueDetail: null, - } - const result = dateChartService.isDataToCome(dataLoad, FluidType.GAS) - expect(result).toBe(false) - }) - - it('should return true for water fluidType and dataLoad with date < today-3', () => { - const dataLoad: Dataload = { - date: today.plus({ day: -2 }), - value: 0, - valueDetail: null, - } - const result = dateChartService.isDataToCome(dataLoad, FluidType.WATER) - expect(result).toBe(true) - }) - - it('should return false for water fluidType and dataLoad with date > J+5', () => { - const dataLoad: Dataload = { - date: today.plus({ day: -6 }), - value: 0, - valueDetail: null, - } - const result = dateChartService.isDataToCome(dataLoad, FluidType.WATER) - expect(result).toBe(false) - }) - }) }) diff --git a/src/services/dateChart.service.ts b/src/services/dateChart.service.ts index 2d85d3fd24866df224d8c2f82ff4d85ea2586826..6bb1f0f67e78db16e12934d17f01a5bead39b154 100644 --- a/src/services/dateChart.service.ts +++ b/src/services/dateChart.service.ts @@ -296,76 +296,6 @@ export default class DateChartService { } } - public isDataToCome(dataload: Dataload, fluidType: FluidType) { - const configService = new ConfigService() - const fluidConfig = configService.getFluidConfig() - - const inter = - dataload && - Interval.fromDateTimes( - dataload.date.startOf('day'), - DateTime.local() - .setZone('utc', { - keepLocalTime: true, - }) - .startOf('day') - ).count('days') - if ( - fluidType === FluidType.ELECTRICITY && - inter <= fluidConfig[0].dataDelayOffset + 1 - ) { - return true - } - if ( - fluidType === FluidType.WATER && - inter <= fluidConfig[1].dataDelayOffset + 1 - ) { - return true - } - if ( - fluidType === FluidType.GAS && - inter <= fluidConfig[2].dataDelayOffset + 1 - ) { - return true - } else { - return false - } - } - - /** - * Checks if there is data after a lack of data so we know if it is a hole or not - * @param {Datachart} currentDatachart - * @returns - */ - public isDataHole( - currentDatachart: Datachart, - fluidType?: FluidType - ): boolean { - let isDataHole = false - let isEmpty = false - if (fluidType || fluidType === 0) { - currentDatachart.actualData.forEach((data: Dataload) => { - if (data.valueDetail && data.valueDetail[fluidType] === -1) { - isEmpty = true - } - if (data.valueDetail && data.valueDetail[fluidType] > -1 && isEmpty) - isDataHole = true - }) - } else { - currentDatachart.actualData.forEach((data: Dataload) => { - if (data.value === -1) { - isEmpty = true - } - if (data.value > -1 && isEmpty) isDataHole = true - }) - } - if (isDataHole) { - return true - } else { - return false - } - } - /** * Checks if the last data date is outdated and returns the number of missing days * @param {DateTime | null} lastDataDate diff --git a/src/services/duel.service.ts b/src/services/duel.service.ts index 7360017e6d981f4963cb880e0515a338f943c640..82bf4af528a04073afd4d2511898bd716a9cc0eb 100644 --- a/src/services/duel.service.ts +++ b/src/services/duel.service.ts @@ -91,11 +91,16 @@ export default class DuelService { TimeStep.DAY, fluidType, undefined, + undefined, true ) if (dataLoad && dataLoad.actualData) { dataLoad.actualData.forEach((d: Dataload) => { - if (d.value === -1 || (d.valueDetail && d.valueDetail.includes(-1))) + if ( + d.value === -1 || + (d.valueDetail && + d.valueDetail.filter(data => data.value === -1).length > 0) + ) isComplete = false }) } diff --git a/src/services/enedisMonthlyAnalysisData.service.ts b/src/services/enedisMonthlyAnalysisData.service.ts index dbb828bdb493ef565bb0e5390145686ca48a3dc9..ce18173c4f017cd31cdb401e2f50674c0bbc3071 100644 --- a/src/services/enedisMonthlyAnalysisData.service.ts +++ b/src/services/enedisMonthlyAnalysisData.service.ts @@ -4,6 +4,7 @@ import { ENEDIS_MAXPOWER_DOCTYPE, ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE, } from 'doctypes' +import { DataloadState } from 'enum/dataload.enum' import { DateTime } from 'luxon' import { Dataload } from 'models' import { @@ -64,6 +65,7 @@ export default class EnedisMonthlyAnalysisDataService { data.weekDaysHalfHourAverageValues.forEach((value, index) => { dataLoadWeekDays.push({ value: value, + state: DataloadState.VALID, valueDetail: null, date: DateTime.fromObject({ year: data.year, @@ -79,6 +81,7 @@ export default class EnedisMonthlyAnalysisDataService { data.weekEndDaysHalfHourAverageValues.forEach((value, index) => { dataLoadWeekEndDays.push({ value: value, + state: DataloadState.VALID, valueDetail: null, date: DateTime.fromObject({ year: data.year, diff --git a/src/services/fluid.service.spec.ts b/src/services/fluid.service.spec.ts index fe9caea0aeae04d9a52a8f495d8563c7b412a88f..af2a1acff31a454c01a22d8dce29ffa10d1db562 100644 --- a/src/services/fluid.service.spec.ts +++ b/src/services/fluid.service.spec.ts @@ -41,15 +41,29 @@ jest.mock('./triggers.service', () => { }) }) +const mockFetchAllFirstDateData = jest.fn() const mockFetchAllLastDateData = jest.fn() jest.mock('./consumption.service', () => { return jest.fn(() => { return { + fetchAllFirstDateData: mockFetchAllFirstDateData, fetchAllLastDateData: mockFetchAllLastDateData, } }) }) +const mockDataDates: (DateTime | null)[] = [ + DateTime.local().setZone('utc', { + keepLocalTime: true, + }), + DateTime.local().setZone('utc', { + keepLocalTime: true, + }), + DateTime.local().setZone('utc', { + keepLocalTime: true, + }), +] + describe('FLuid service', () => { const fluidService = new FluidService(mockClient) @@ -57,27 +71,19 @@ describe('FLuid service', () => { mockGetAccountByType.mockReset() mockGetTrigger.mockReset() mockFetchTriggerState.mockReset() + mockFetchTriggerState.mockReset() + mockFetchAllFirstDateData.mockReset() mockFetchAllLastDateData.mockReset() }) describe('getFluidStatus method', () => { it('should return fluid status for all fluids', async () => { - const mockLastDataDates: (DateTime | null)[] = [ - DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - ] const mockResult: FluidStatus[] = [ { fluidType: FluidType.ELECTRICITY, status: FluidState.ERROR, - lastDataDate: mockLastDataDates[FluidType.ELECTRICITY], + firstDataDate: mockDataDates[FluidType.ELECTRICITY], + lastDataDate: mockDataDates[FluidType.ELECTRICITY], connection: { konnector: konnectorsData[0], account: accountsData[0], @@ -97,7 +103,8 @@ describe('FLuid service', () => { { fluidType: FluidType.WATER, status: FluidState.ERROR, - lastDataDate: mockLastDataDates[FluidType.WATER], + firstDataDate: mockDataDates[FluidType.WATER], + lastDataDate: mockDataDates[FluidType.WATER], connection: { konnector: konnectorsData[1], account: accountsData[1], @@ -118,7 +125,8 @@ describe('FLuid service', () => { { fluidType: FluidType.GAS, status: FluidState.ERROR, - lastDataDate: mockLastDataDates[FluidType.GAS], + firstDataDate: mockDataDates[FluidType.GAS], + lastDataDate: mockDataDates[FluidType.GAS], connection: { konnector: konnectorsData[2], account: accountsData[2], @@ -149,28 +157,19 @@ describe('FLuid service', () => { .mockResolvedValueOnce(triggersData[1]) .mockResolvedValueOnce(triggersData[2]) mockFetchTriggerState.mockResolvedValue(triggerStateData) - mockFetchAllLastDateData.mockResolvedValue(mockLastDataDates) + mockFetchAllFirstDateData.mockResolvedValue(mockDataDates) + mockFetchAllLastDateData.mockResolvedValue(mockDataDates) const result: FluidStatus[] = await fluidService.getFluidStatus() expect(result).toEqual(mockResult) }) it('should return fluid status with NOT_CONNECTED status when no accounts', async () => { - const mockLastDataDates: (DateTime | null)[] = [ - DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - ] const mockResult: FluidStatus[] = [ { fluidType: FluidType.ELECTRICITY, status: FluidState.NOT_CONNECTED, - lastDataDate: mockLastDataDates[FluidType.ELECTRICITY], + firstDataDate: mockDataDates[FluidType.ELECTRICITY], + lastDataDate: mockDataDates[FluidType.ELECTRICITY], connection: { konnector: konnectorsData[0], account: null, @@ -190,7 +189,8 @@ describe('FLuid service', () => { { fluidType: FluidType.WATER, status: FluidState.NOT_CONNECTED, - lastDataDate: mockLastDataDates[FluidType.WATER], + firstDataDate: mockDataDates[FluidType.WATER], + lastDataDate: mockDataDates[FluidType.WATER], connection: { konnector: konnectorsData[1], account: null, @@ -211,7 +211,8 @@ describe('FLuid service', () => { { fluidType: FluidType.GAS, status: FluidState.NOT_CONNECTED, - lastDataDate: mockLastDataDates[FluidType.GAS], + firstDataDate: mockDataDates[FluidType.GAS], + lastDataDate: mockDataDates[FluidType.GAS], connection: { konnector: konnectorsData[2], account: null, @@ -242,28 +243,19 @@ describe('FLuid service', () => { .mockResolvedValueOnce(triggersData[1]) .mockResolvedValueOnce(triggersData[2]) mockFetchTriggerState.mockResolvedValue(triggerStateData) - mockFetchAllLastDateData.mockResolvedValue(mockLastDataDates) + mockFetchAllFirstDateData.mockResolvedValue(mockDataDates) + mockFetchAllLastDateData.mockResolvedValue(mockDataDates) const result: FluidStatus[] = await fluidService.getFluidStatus() expect(result).toEqual(mockResult) }) it('should return fluid status with KONNECTOR_NOT_FOUND status when no konnector', async () => { - const mockLastDataDates: (DateTime | null)[] = [ - DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - ] const mockResult: FluidStatus[] = [ { fluidType: FluidType.ELECTRICITY, status: FluidState.KONNECTOR_NOT_FOUND, - lastDataDate: mockLastDataDates[FluidType.ELECTRICITY], + firstDataDate: mockDataDates[FluidType.ELECTRICITY], + lastDataDate: mockDataDates[FluidType.ELECTRICITY], connection: { konnector: null, account: accountsData[0], @@ -283,7 +275,8 @@ describe('FLuid service', () => { { fluidType: FluidType.WATER, status: FluidState.KONNECTOR_NOT_FOUND, - lastDataDate: mockLastDataDates[FluidType.WATER], + firstDataDate: mockDataDates[FluidType.WATER], + lastDataDate: mockDataDates[FluidType.WATER], connection: { konnector: null, account: accountsData[1], @@ -304,7 +297,8 @@ describe('FLuid service', () => { { fluidType: FluidType.GAS, status: FluidState.KONNECTOR_NOT_FOUND, - lastDataDate: mockLastDataDates[FluidType.GAS], + firstDataDate: mockDataDates[FluidType.GAS], + lastDataDate: mockDataDates[FluidType.GAS], connection: { konnector: null, account: accountsData[2], @@ -335,28 +329,19 @@ describe('FLuid service', () => { .mockResolvedValueOnce(triggersData[1]) .mockResolvedValueOnce(triggersData[2]) mockFetchTriggerState.mockResolvedValue(triggerStateData) - mockFetchAllLastDateData.mockResolvedValue(mockLastDataDates) + mockFetchAllFirstDateData.mockResolvedValue(mockDataDates) + mockFetchAllLastDateData.mockResolvedValue(mockDataDates) const result: FluidStatus[] = await fluidService.getFluidStatus() expect(result).toEqual(mockResult) }) it('should return fluid status with NOT_CONNECTED status when no triggers', async () => { - const mockLastDataDates: (DateTime | null)[] = [ - DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - DateTime.local().setZone('utc', { - keepLocalTime: true, - }), - ] const mockResult: FluidStatus[] = [ { fluidType: FluidType.ELECTRICITY, status: FluidState.NOT_CONNECTED, - lastDataDate: mockLastDataDates[FluidType.ELECTRICITY], + firstDataDate: mockDataDates[FluidType.ELECTRICITY], + lastDataDate: mockDataDates[FluidType.ELECTRICITY], connection: { konnector: konnectorsData[0], account: accountsData[0], @@ -376,7 +361,8 @@ describe('FLuid service', () => { { fluidType: FluidType.WATER, status: FluidState.NOT_CONNECTED, - lastDataDate: mockLastDataDates[FluidType.WATER], + firstDataDate: mockDataDates[FluidType.WATER], + lastDataDate: mockDataDates[FluidType.WATER], connection: { konnector: konnectorsData[1], account: accountsData[1], @@ -397,7 +383,8 @@ describe('FLuid service', () => { { fluidType: FluidType.GAS, status: FluidState.NOT_CONNECTED, - lastDataDate: mockLastDataDates[FluidType.GAS], + firstDataDate: mockDataDates[FluidType.GAS], + lastDataDate: mockDataDates[FluidType.GAS], connection: { konnector: konnectorsData[2], account: accountsData[2], @@ -428,22 +415,20 @@ describe('FLuid service', () => { .mockResolvedValueOnce(null) .mockResolvedValueOnce(null) mockFetchTriggerState.mockResolvedValue(triggerStateData) - mockFetchAllLastDateData.mockResolvedValue(mockLastDataDates) + mockFetchAllFirstDateData.mockResolvedValue(mockDataDates) + mockFetchAllLastDateData.mockResolvedValue(mockDataDates) const result: FluidStatus[] = await fluidService.getFluidStatus() expect(result).toEqual(mockResult) }) - it('should return fluid status with null laste date for water and gaz', async () => { - const mockLastDataDates: (DateTime | null)[] = [ - DateTime.local(), - null, - null, - ] + it('should return fluid status with a null first/last date for water and gaz', async () => { + const _mockDataDates: (DateTime | null)[] = [DateTime.local(), null, null] const mockResult: FluidStatus[] = [ { fluidType: FluidType.ELECTRICITY, status: FluidState.ERROR, - lastDataDate: mockLastDataDates[FluidType.ELECTRICITY], + firstDataDate: _mockDataDates[FluidType.ELECTRICITY], + lastDataDate: _mockDataDates[FluidType.ELECTRICITY], connection: { konnector: konnectorsData[0], account: accountsData[0], @@ -463,6 +448,7 @@ describe('FLuid service', () => { { fluidType: FluidType.WATER, status: FluidState.NOT_CONNECTED, + firstDataDate: null, lastDataDate: null, connection: { konnector: konnectorsData[1], @@ -484,6 +470,7 @@ describe('FLuid service', () => { { fluidType: FluidType.GAS, status: FluidState.NOT_CONNECTED, + firstDataDate: null, lastDataDate: null, connection: { konnector: konnectorsData[2], @@ -518,7 +505,8 @@ describe('FLuid service', () => { .mockResolvedValueOnce(triggerStateData) .mockResolvedValueOnce(null) .mockResolvedValueOnce(null) - mockFetchAllLastDateData.mockResolvedValue(mockLastDataDates) + mockFetchAllFirstDateData.mockResolvedValue(_mockDataDates) + mockFetchAllLastDateData.mockResolvedValue(_mockDataDates) const result: FluidStatus[] = await fluidService.getFluidStatus() expect(result).toEqual(mockResult) }) @@ -530,6 +518,9 @@ describe('FLuid service', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.DONE, + firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { + keepLocalTime: true, + }), lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { keepLocalTime: true, }), @@ -561,6 +552,11 @@ describe('FLuid service', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.DONE, + firstDataDate: DateTime.local() + .minus({ day: 31 }) + .setZone('utc', { + keepLocalTime: true, + }), lastDataDate: DateTime.local() .minus({ day: 1 }) .setZone('utc', { @@ -594,6 +590,9 @@ describe('FLuid service', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.NOT_CONNECTED, + firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { + keepLocalTime: true, + }), lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { keepLocalTime: true, }), @@ -625,6 +624,9 @@ describe('FLuid service', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { + keepLocalTime: true, + }), lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { keepLocalTime: true, }), @@ -660,6 +662,9 @@ describe('FLuid service', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.PARTNER_ISSUE, + firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { + keepLocalTime: true, + }), lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { keepLocalTime: true, }), @@ -682,6 +687,9 @@ describe('FLuid service', () => { { fluidType: FluidType.WATER, status: FluidState.ERROR_LOGIN_FAILED, + firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { + keepLocalTime: true, + }), lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { keepLocalTime: true, }), @@ -712,6 +720,9 @@ describe('FLuid service', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.PARTNER_ISSUE, + firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { + keepLocalTime: true, + }), lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { keepLocalTime: true, }), @@ -734,6 +745,9 @@ describe('FLuid service', () => { { fluidType: FluidType.WATER, status: FluidState.ERROR_LOGIN_FAILED, + firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { + keepLocalTime: true, + }), lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { keepLocalTime: true, }), @@ -756,6 +770,9 @@ describe('FLuid service', () => { { fluidType: FluidType.GAS, status: FluidState.ERROR_LOGIN_FAILED, + firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', { + keepLocalTime: true, + }), lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', { keepLocalTime: true, }), diff --git a/src/services/fluid.service.ts b/src/services/fluid.service.ts index b23c492a36c4d4ad21d3d450bde449b357d86411..5569acc917698f01b0492261d7c48613f0a81f3c 100644 --- a/src/services/fluid.service.ts +++ b/src/services/fluid.service.ts @@ -148,6 +148,9 @@ export default class FluidService { waterTrigger ? triggerService.fetchTriggerState(waterTrigger) : null, gasTrigger ? triggerService.fetchTriggerState(gasTrigger) : null, ]) + const firstDataDates: (DateTime | null)[] = await consumptionService.fetchAllFirstDateData( + [FluidType.ELECTRICITY, FluidType.WATER, FluidType.GAS] + ) const lastDataDates: (DateTime | null)[] = await consumptionService.fetchAllLastDateData( [FluidType.ELECTRICITY, FluidType.WATER, FluidType.GAS] ) @@ -164,6 +167,7 @@ export default class FluidService { ) ? FluidState.PARTNER_ISSUE : this.parseFluidStatus(elecKonnector, elecStatus), + firstDataDate: firstDataDates[FluidType.ELECTRICITY], lastDataDate: lastDataDates[FluidType.ELECTRICITY], connection: { shouldLaunchKonnector: false, @@ -187,6 +191,7 @@ export default class FluidService { ) ? FluidState.PARTNER_ISSUE : this.parseFluidStatus(waterKonnector, waterStatus), + firstDataDate: firstDataDates[FluidType.WATER], lastDataDate: lastDataDates[FluidType.WATER], connection: { shouldLaunchKonnector: false, @@ -210,6 +215,7 @@ export default class FluidService { ) ? FluidState.PARTNER_ISSUE : this.parseFluidStatus(gasKonnector, gasStatus), + firstDataDate: firstDataDates[FluidType.GAS], lastDataDate: lastDataDates[FluidType.GAS], connection: { shouldLaunchKonnector: false, diff --git a/src/services/fluidsPrices.service.spec.ts b/src/services/fluidsPrices.service.spec.ts index c3a9fe500ff6e1cda8c6da1c9b674746e28b19d9..e3c1c5f785fbb153906512a02166584a9a65613b 100644 --- a/src/services/fluidsPrices.service.spec.ts +++ b/src/services/fluidsPrices.service.spec.ts @@ -118,4 +118,60 @@ describe('FluidPrices service', () => { expect(result).toBe(false) }) }) + it('should checkIfPriceExists and return it', async () => { + const mockQueryResult: QueryResult<FluidPrice[]> = { + data: [fluidPrices[0]], + bookmark: '', + next: false, + skip: 0, + } + mockClient.query.mockResolvedValueOnce(mockQueryResult) + const price = await fluidPricesService.checkIfPriceExists(fluidPrices[0]) + expect(price).toStrictEqual(fluidPrices[0]) + expect(mockClient.query).toBeCalled() + }) + it('should create a price and return it', async () => { + const mockQueryResult: QueryResult<FluidPrice> = { + data: fluidPrices[0], + bookmark: '', + next: false, + skip: 0, + } + mockClient.create.mockResolvedValueOnce(mockQueryResult) + const result = await fluidPricesService.createPrice(fluidPrices[0]) + expect(result).toEqual(fluidPrices[0]) + }) + it('should fail to create a price', async () => { + mockClient.create.mockRejectedValue(new Error()) + try { + await fluidPricesService.createPrice(fluidPrices[0]) + } catch (error) { + expect(error).toEqual(new Error()) + } + }) + it('should update a price', async () => { + const updatedPrice = { ...fluidPrices[0], price: 0.1 } + const mockQueryResult: QueryResult<FluidPrice | null> = { + data: updatedPrice, + bookmark: '', + next: false, + skip: 0, + } + mockClient.save.mockResolvedValue(mockQueryResult) + const price = await fluidPricesService.updatePrice(fluidPrices[0], { + price: 0.1, + }) + expect(price).toStrictEqual(updatedPrice) + expect(mockClient.query).toBeCalled() + }) + it('should fail to update a price', async () => { + mockClient.save.mockRejectedValue(new Error()) + try { + await fluidPricesService.updatePrice(fluidPrices[0], { + price: 0.1, + }) + } catch (error) { + expect(error).toEqual(new Error()) + } + }) }) diff --git a/src/services/fluidsPrices.service.ts b/src/services/fluidsPrices.service.ts index bea791b40e0adec15fe2da943f3df4cc9c6c79ce..48d95edb36b804bf98b157c6c1e7bf75798e49eb 100644 --- a/src/services/fluidsPrices.service.ts +++ b/src/services/fluidsPrices.service.ts @@ -36,7 +36,13 @@ export default class FluidPricesService { date: DateTime ): Promise<FluidPrice> { const query: QueryDefinition = Q(FLUIDPRICES_DOCTYPE) - .where({ startDate: { $lt: date.toString() }, fluidType }) + .indexFields(['startDate']) + .where({ + startDate: { + $lte: date.toISO({ suppressMilliseconds: true }).toString(), + }, + fluidType, + }) .sortBy([{ startDate: 'desc' }]) .limitBy(1) @@ -52,6 +58,7 @@ export default class FluidPricesService { */ public async getAllLastPrices(): Promise<FluidPrice[]> { const query: QueryDefinition = Q(FLUIDPRICES_DOCTYPE) + .indexFields(['fluidType']) .where({ endDate: { $eq: null } }) .sortBy([{ fluidType: 'asc' }]) .limitBy(3) @@ -104,4 +111,65 @@ export default class FluidPricesService { return false } } + + /** + * Check if a fluidprice exists in db + * @param {FluidPrice} fluidPrice + * @returns {FluidPrice | null} price or null + */ + public async checkIfPriceExists( + fluidPrice: FluidPrice + ): Promise<FluidPrice | null> { + const query: QueryDefinition = Q(FLUIDPRICES_DOCTYPE).where({ + startDate: { $eq: fluidPrice.startDate }, + fluidType: { $eq: fluidPrice.fluidType }, + }) + const { + data: [price], + }: QueryResult<FluidPrice[]> = await this._client.query(query) + if (price) return price + else return null + } + + /** + * Creates a new fluidPrice + * @param {FluidPrice} fluidPrice + * @returns {FluidPrice | null} price or null + */ + public async createPrice(newPrice: FluidPrice): Promise<FluidPrice | null> { + try { + const { + data: createdPrice, + }: QueryResult<FluidPrice> = await this._client.create( + FLUIDPRICES_DOCTYPE, + newPrice + ) + return createdPrice + } catch (error) { + console.log('Error creating new createdPrice: ', error) + throw error + } + } + + /** + * Updates a price in db + * @param {FluidPrice} doc + * @param {Partial<FluidPrice>} attributes + * @returns {FluidPrice | null} + */ + public async updatePrice( + doc: FluidPrice, + attributes: Partial<FluidPrice> + ): Promise<FluidPrice | null> { + const { + data: fluidPrice, + }: QueryResult<FluidPrice | null> = await this._client.save({ + ...doc, + ...attributes, + }) + if (fluidPrice) { + return fluidPrice + } + return null + } } diff --git a/src/services/initialization.service.spec.ts b/src/services/initialization.service.spec.ts index ea766400e86cbc57ca569cb0db43f60fd1852d8d..e782eedb8fc165277f36494c357ee67a8b2e6e61 100644 --- a/src/services/initialization.service.spec.ts +++ b/src/services/initialization.service.spec.ts @@ -9,7 +9,6 @@ import challengeEntityData from 'db/challengeEntity.json' import duelEntityData from 'db/duelEntity.json' import quizEntityData from 'db/quizEntity.json' import explorationEntityData from 'db/explorationEntity.json' -import fluidPrices from 'db/fluidPrices.json' import { hashFile } from 'utils/hash' import { getActualAnalysisDate } from 'utils/date' @@ -23,11 +22,11 @@ import { allChallengeEntityData } from '../../tests/__mocks__/challengeEntity.mo import { allDuelEntity } from '../../tests/__mocks__/duelData.mock' import { allQuizEntities } from '../../tests/__mocks__/quizData.mock' import { allExplorationEntities } from '../../tests/__mocks__/explorationData.mock' -import { fluidPrices as allFluidPrices } from '../../tests/__mocks__/fluidPrice.mock' import { mockOutdatedTerm, mockUpToDateTerm, } from '../../tests/__mocks__/termsData.mock' +import { fluidPrices } from '../../tests/__mocks__/fluidPrice.mock' const mockCreateIndexKonnector = jest.fn() jest.mock('./konnector.service', () => { @@ -74,6 +73,7 @@ const mockDeleteAllChallengeEntities = jest.fn() const mockBuildUserChallengeList = jest.fn() const mockGetUserChallengeDataload = jest.fn() const mockUserChallengeUpdateFlag = jest.fn() +const mockInitChallengeDuelProgress = jest.fn() jest.mock('./challenge.service', () => { return jest.fn(() => { return { @@ -82,6 +82,7 @@ jest.mock('./challenge.service', () => { buildUserChallengeList: mockBuildUserChallengeList, getUserChallengeDataload: mockGetUserChallengeDataload, updateUserChallenge: mockUserChallengeUpdateFlag, + initChallengeDuelProgress: mockInitChallengeDuelProgress, } }) }) @@ -164,7 +165,11 @@ jest.mock('./terms.service', () => { }) describe('Initialization service', () => { - const initializationService = new InitializationService(mockClient) + const initializationService = new InitializationService( + mockClient, + jest.fn(), + jest.fn() + ) beforeEach(() => { mockClient.query.mockClear() mockClient.create.mockClear() @@ -358,101 +363,17 @@ describe('Initialization service', () => { mockGetAllPrices.mockClear() mockDeleteAllFluidsPrices.mockClear() }) - it('should return hash when fluidPrices hash is already up to date', async () => { + it('should do nothing because prices are already created', async () => { mockGetAllPrices.mockResolvedValueOnce(fluidPrices) - const hash = hashFile(fluidPrices) - await expect( - initializationService.initFluidPrices(hash) - ).resolves.toEqual(hash) - }) - it('should return hash when fluidPrices are created', async () => { - mockGetAllPrices - .mockResolvedValueOnce(null) - .mockResolvedValueOnce(fluidPrices) - const mockQueryResult: QueryResult<boolean> = { - data: true, - bookmark: '', - next: false, - skip: 0, - } - mockClient.create.mockResolvedValue(mockQueryResult) - const hash = hashFile(fluidPrices) - await expect( - initializationService.initFluidPrices(hash) - ).resolves.toEqual(hash) - }) - it('should throw an error when fluidPrices entities should be created and created fluidPrices entities number does not match', async () => { - mockGetAllPrices - .mockResolvedValueOnce(null) - .mockResolvedValueOnce(allFluidPrices) - const mockQueryResult: QueryResult<boolean> = { - data: true, - bookmark: '', - next: false, - skip: 0, - } - mockClient.create.mockResolvedValue(mockQueryResult) - await expect( - initializationService.initFluidPrices(hashFile(fluidPrices)) - ).rejects.toThrow( - new Error( - 'initFluidPrices: Created fluidPrices type entities does not match' - ) - ) - }) - it('should throw an error when fluidPrices should be created and creation failed', async () => { - mockGetAllPrices.mockResolvedValueOnce(null) - mockClient.create.mockRejectedValue(new Error()) - await expect( - initializationService.initChallengeEntity(hashFile(fluidPrices)) - ).rejects.toThrow(new Error()) - }) - it('should return hash when fluidPrices are updated', async () => { - mockGetAllPrices - .mockResolvedValueOnce(fluidPrices) - .mockResolvedValueOnce(fluidPrices) - mockDeleteAllFluidsPrices.mockResolvedValue(true) - const mockQueryResult: QueryResult<boolean> = { - data: true, - bookmark: '', - next: false, - skip: 0, - } - mockClient.create.mockResolvedValue(mockQueryResult) - await expect(initializationService.initFluidPrices('')).resolves.toEqual( - hashFile(fluidPrices) - ) - }) - it('should throw an error when fluidPrices should be updated and fluidPrices entities number does not match', async () => { - mockGetAllPrices - .mockResolvedValueOnce('') - .mockResolvedValueOnce(allFluidPrices) - mockDeleteAllFluidsPrices.mockResolvedValue(true) - const mockQueryResult: QueryResult<boolean> = { - data: true, - bookmark: '', - next: false, - skip: 0, - } - mockClient.create.mockResolvedValue(mockQueryResult) - await expect(initializationService.initFluidPrices('')).rejects.toThrow( - new Error( - 'initFluidPrices: Created fluidPrices type entities does not match' - ) - ) + const isDone = await initializationService.initFluidPrices() + expect(isDone).toBeTruthy() }) - it('should throw an error whenfluidPrices should be updated and fluidPrices entities creation failed', async () => { - mockGetAllPrices - .mockResolvedValueOnce(fluidPrices) - .mockResolvedValueOnce(fluidPrices) - mockDeleteAllFluidsPrices.mockResolvedValue(true) - mockClient.create.mockRejectedValueOnce(new Error()) - expect(initializationService.initFluidPrices('')).rejects.toThrow( - new Error() - ) + it('should try to fetch prices from remote doctype', async () => { + mockGetAllPrices.mockResolvedValueOnce('') + const isDone = await initializationService.initFluidPrices() + expect(isDone).toBeFalsy() }) }) - describe('initChallengeEntity method', () => { beforeEach(() => { mockGetAllChallengeEntities.mockClear() @@ -981,11 +902,9 @@ describe('Initialization service', () => { describe('initDuelProgress method', () => { beforeEach(() => { - mockGetUserChallengeDataload.mockClear() - mockUserChallengeUpdateFlag.mockClear() + mockInitChallengeDuelProgress.mockClear() }) - it('should return updatedUserChallenge and dataload ', async () => { - mockGetUserChallengeDataload.mockResolvedValueOnce(graphData.actualData) + it('should return updatedUserChallenge and dataload', async () => { const expectedUpdatedUserChallenge: UserChallenge = { ...userChallengeData[0], duel: { @@ -993,19 +912,17 @@ describe('Initialization service', () => { userConsumption: 130.83585, }, } - mockUserChallengeUpdateFlag.mockResolvedValueOnce( - expectedUpdatedUserChallenge - ) const expectedResult = { updatedUserChallenge: expectedUpdatedUserChallenge, dataloads: graphData.actualData, } + mockInitChallengeDuelProgress.mockResolvedValueOnce(expectedResult) await expect( initializationService.initDuelProgress(userChallengeData[0]) ).resolves.toEqual(expectedResult) }) it('should throw an error when it fails to retrieve the status', async () => { - mockGetUserChallengeDataload.mockRejectedValueOnce(new Error()) + mockInitChallengeDuelProgress.mockRejectedValueOnce(new Error()) await expect( initializationService.initDuelProgress(userChallengeData[0]) ).rejects.toThrow(new Error()) diff --git a/src/services/initialization.service.ts b/src/services/initialization.service.ts index bb1704d2df8cc46327ccc571ab6e75679d718530..43ff56592c980d9472d91f301d41e06f1bca6ac5 100644 --- a/src/services/initialization.service.ts +++ b/src/services/initialization.service.ts @@ -16,12 +16,12 @@ import { DUEL_DOCTYPE, QUIZ_DOCTYPE, EXPLORATION_DOCTYPE, - FLUIDPRICES_DOCTYPE, } from 'doctypes' import { FluidType } from 'enum/fluid.enum' import { Dataload, + FluidPrice, FluidStatus, Profile, ProfileType, @@ -36,7 +36,6 @@ import challengeEntityData from 'db/challengeEntity.json' import duelEntityData from 'db/duelEntity.json' import quizEntityData from 'db/quizEntity.json' import explorationEntityData from 'db/explorationEntity.json' -import fluidPrices from 'db/fluidPrices.json' import ProfileService from 'services/profile.service' import profileData from 'db/profileData.json' @@ -51,9 +50,6 @@ import ExplorationService from 'services/exploration.service' import { hashFile } from 'utils/hash' import { getActualAnalysisDate } from 'utils/date' import { TimeStep } from 'enum/timeStep.enum' -import ConsumptionDataManager from './consumption.service' -import { UserChallengeUpdateFlag } from 'enum/userChallenge.enum' -import { getRoundFloat } from 'utils/math' import { DateTime } from 'luxon' import ProfileTypeEntityService from './profileTypeEntity.service' import TermsService from './terms.service' @@ -61,12 +57,27 @@ import log from 'utils/logger' import { ProfileEcogesture } from 'models/profileEcogesture.model' import ProfileEcogestureService from './profileEcogesture.service' import FluidPricesService from './fluidsPrices.service' +import EnvironmentService from './environment.service' +import React from 'react' +import { InitSteps, InitStepsErrors } from 'models/initialisationSteps.model' export default class InitializationService { private readonly _client: Client + private readonly _setinitStep: React.Dispatch<React.SetStateAction<InitSteps>> + private readonly _setinitStepError: React.Dispatch< + React.SetStateAction<InitStepsErrors | null> + > - constructor(_client: Client) { + constructor( + _client: Client, + _setinitStep: React.Dispatch<React.SetStateAction<InitSteps>>, + _setinitStepError: React.Dispatch< + React.SetStateAction<InitStepsErrors | null> + > + ) { this._client = _client + this._setinitStep = _setinitStep + this._setinitStepError = _setinitStepError } /* @@ -142,6 +153,7 @@ export default class InitializationService { log.info('[Initialization] Indexes created') return true } catch (error) { + this._setinitStepError(InitStepsErrors.INDEX_ERROR) log.error('Initialization error - initIndex: ', error) throw error } @@ -156,6 +168,7 @@ export default class InitializationService { public async initProfile(): Promise<Profile | null> { const profileService = new ProfileService(this._client) try { + this._setinitStep(InitSteps.PROFILE) const loadedProfile = await profileService.getProfile() if (!loadedProfile) { // Population with the data @@ -166,6 +179,7 @@ export default class InitializationService { if (newProfile) { log.info('[Initialization] Profile created') } else { + this._setinitStepError(InitStepsErrors.PROFILE_ERROR) throw new Error('initProfile: Profile not created') } } else { @@ -178,6 +192,7 @@ export default class InitializationService { }) return updatedProfile } catch (error) { + this._setinitStepError(InitStepsErrors.PROFILE_ERROR) log.error('Initialization error - initProfile: ', error) throw error } @@ -196,6 +211,7 @@ export default class InitializationService { log.info('[Initialization] ProfileType loaded') return loadedProfileType } catch (error) { + this._setinitStepError(InitStepsErrors.PROFILETYPE_ERROR) log.error('Initialization error - initProfileType: ', error) throw error } @@ -207,12 +223,14 @@ export default class InitializationService { log.info('[Initialization] ProfileEcogesture loaded') return loadedProfileEcogesture } catch (error) { + this._setinitStepError(InitStepsErrors.PROFILETYPE_ERROR) log.error('Initialization error - initProfileEcogesture: ', error) throw error } } public async initEcogesture(hash: string): Promise<string> { + this._setinitStep(InitSteps.ECOGESTURE) const hashEcogestureType = hashFile(ecogestureData) const ecogestureService = new EcogestureService(this._client) // Populate data if none ecogesture exists @@ -235,6 +253,7 @@ export default class InitializationService { !checkCount || (checkCount && checkCount.length !== ecogestureData.length) ) { + this._setinitStepError(InitStepsErrors.ECOGESTURE_ERROR) throw new Error( 'initEcogesture: Created ecogesture type entities does not match' ) @@ -242,6 +261,7 @@ export default class InitializationService { log.info('[Initialization] Ecogesture list created') return hashEcogestureType } catch (error) { + this._setinitStepError(InitStepsErrors.ECOGESTURE_ERROR) log.error('Initialization error - initEcogesture: ', error) throw error } @@ -273,6 +293,7 @@ export default class InitializationService { !checkCount || (checkCount && checkCount.length !== ecogestureData.length) ) { + this._setinitStepError(InitStepsErrors.ECOGESTURE_ERROR) throw new Error( 'initEcogesture: Created ecogesture type entities does not match' ) @@ -280,6 +301,7 @@ export default class InitializationService { log.info('[Initialization] Ecogesture updated') return hashEcogestureType } catch (error) { + this._setinitStepError(InitStepsErrors.ECOGESTURE_ERROR) log.error('Initialization error - initEcogesture: ', error) throw error } @@ -290,70 +312,49 @@ export default class InitializationService { } } - public async initFluidPrices(hash: string): Promise<string> { - const hashFluidPricesType = hashFile(fluidPrices) + public async initFluidPrices(): Promise<boolean> { const fpService = new FluidPricesService(this._client) // Populate data if none ecogesture exists const loadedPrices = await fpService.getAllPrices() - if (!loadedPrices || (loadedPrices && loadedPrices.length === 0)) { - // Populate the doctype with data - + if (loadedPrices && loadedPrices.length) { + log.info('[Initialization] FluidPrices db already created') + return true + } else { try { - for (const price of fluidPrices) { - await this._client.create(FLUIDPRICES_DOCTYPE, price) + const fluidTypes: FluidType[] = [ + FluidType.ELECTRICITY, + FluidType.WATER, + FluidType.GAS, + ] + const allPrices: FluidPrice[] = [] + const env = new EnvironmentService() + const remoteUrl = env.isProduction() + ? `/remote/org.ecolyo.backoffice.prices` + : `/remote/org.ecolyo.backoffice.prices.rec` + + for (const fluid of fluidTypes) { + const prices = await this._client + .getStackClient() + .fetchJSON('GET', `${remoteUrl}?fluidtype=${fluid}`) + allPrices.push(...prices) } - // Check of created document based on count - const checkCount = await fpService.getAllPrices() - if ( - !checkCount || - (checkCount && checkCount.length !== fluidPrices.length) - ) { - throw new Error( - 'initFluidPrices: Created fluidPrices type entities does not match' - ) + for (const price of allPrices) { + await fpService.createPrice(price) } - log.info('[Initialization] FluidPrices list created') - return hashFluidPricesType - } catch (error) { - log.error('Initialization error - initFluidPrices: ', error) - throw error - } - } - // Update if the hash is not the same as the one from profile - if (hash !== hashFluidPricesType) { - // Update the doctype - try { - // Deletion of all documents - await fpService.deleteAllFluidsPrices() - // Population with the data - for (const price of fluidPrices) { - await this._client.create(FLUIDPRICES_DOCTYPE, price) - } - // Check of created document based on count - const checkCount = await fpService.getAllPrices() - if ( - !checkCount || - (checkCount && checkCount.length !== fluidPrices.length) - ) { - throw new Error( - 'initFluidPrices: Created fluidPrices type entities does not match' - ) - } - log.info('[Initialization] FluidPrices updated') - return hashFluidPricesType - } catch (error) { - log.error('Initialization error - initFluidPrices: ', error) - throw error + log.info('[Initialization] FluidPrices db created successfully') + return true + } catch (err) { + this._setinitStepError(InitStepsErrors.PRICES_ERROR) + + log.error('Initialization error - initFluidPrices: ', err) + return false } - } else { - // Doctype already up to date - log.info('[Initialization] FluidPrices already up-to-date') - return hashFluidPricesType } } public async initChallengeEntity(hash: string): Promise<string> { + this._setinitStep(InitSteps.CHALLENGES) const challengeHash = hashFile(challengeEntityData) const challengeService = new ChallengeService(this._client) // Populate data if none challengeEntity exists @@ -373,6 +374,7 @@ export default class InitializationService { !checkCount || (checkCount && checkCount.length !== challengeEntityData.length) ) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) throw new Error( 'initChallengeEntity: Created challenge entities does not match' ) @@ -380,6 +382,7 @@ export default class InitializationService { log.info('[Initialization] Challenge entities created') return challengeHash } catch (error) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) log.error('Initialization error - initChallengeEntity: ', error) throw error } @@ -400,6 +403,7 @@ export default class InitializationService { !checkCount || (checkCount && checkCount.length !== challengeEntityData.length) ) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) throw new Error( 'initChallengeEntity: Created challenge entities does not match' ) @@ -407,6 +411,7 @@ export default class InitializationService { log.info('[Initialization] Challenge entities updated') return challengeHash } catch (error) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) log.error('Initialization error - initChallengeEntity: ', error) throw error } @@ -434,6 +439,7 @@ export default class InitializationService { !checkCount || (checkCount && checkCount.length !== duelEntityData.length) ) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) throw new Error( 'initDuelEntity: Created duel entities does not match' ) @@ -441,6 +447,7 @@ export default class InitializationService { log.info('[Initialization] UserDuel entities created') return hashDuelEntity } catch (error) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) log.error('Initialization error - initDuelEntity: ', error) throw error } @@ -461,6 +468,7 @@ export default class InitializationService { !checkCount || (checkCount && checkCount.length !== duelEntityData.length) ) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) throw new Error( 'initDuelEntity: Created duel entities does not match' ) @@ -468,6 +476,7 @@ export default class InitializationService { log.info('[Initialization] UserDuel entities updated') return hashDuelEntity } catch (error) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) log.error('Initialization error - initDuelEntity: ', error) throw error } @@ -498,6 +507,7 @@ export default class InitializationService { !checkCount || (checkCount && checkCount.length !== quizEntityData.length) ) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) throw new Error( 'initQuizEntity: Created quiz entities does not match' ) @@ -506,6 +516,7 @@ export default class InitializationService { log.info('[Initialization] Quiz entities created') return quizHash } catch (error) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) log.error('Initialization error - initQuizEntity: ', error) throw error } @@ -526,6 +537,7 @@ export default class InitializationService { !checkCount || (checkCount && checkCount.length !== quizEntityData.length) ) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) throw new Error( 'initQuizEntity: Created quiz entities does not match' ) @@ -533,6 +545,7 @@ export default class InitializationService { log.info('[Initialization] Quiz entities updated') return quizHash } catch (error) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) log.error('Initialization error - initQuizEntity: ', error) throw error } @@ -563,6 +576,7 @@ export default class InitializationService { !checkCount || (checkCount && checkCount.length !== explorationEntityData.length) ) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) throw new Error( 'initExplorationEntity: Created exploration entities does not match' ) @@ -570,6 +584,7 @@ export default class InitializationService { log.info('[Initialization] Exploration entities created') return explorationHash } catch (error) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) log.error('Initialization error - initExplorationEntity: ', error) throw error } @@ -590,6 +605,7 @@ export default class InitializationService { !checkCount || (checkCount && checkCount.length !== explorationEntityData.length) ) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) throw new Error( 'initExplorationEntity: Created exploration entities does not match' ) @@ -597,6 +613,7 @@ export default class InitializationService { log.info('[Initialization] Exploration entities updated') return explorationHash } catch (error) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) log.error('Initialization error - initExplorationEntity: ', error) throw error } @@ -631,6 +648,7 @@ export default class InitializationService { } } } catch (error) { + this._setinitStepError(InitStepsErrors.ANALYSIS_ERROR) log.error('Initialization error - initAnalysis: ', error) throw error } @@ -649,9 +667,11 @@ export default class InitializationService { log.info('[Initialization] Fluid Types loaded') return fluidtypes } else { + this._setinitStepError(InitStepsErrors.CONSOS_ERROR) throw new Error('initFluidTypes: FluidTypes not found') } } catch (error) { + this._setinitStepError(InitStepsErrors.CONSOS_ERROR) log.error('Initialization error - initFluidTypes: ', error) throw error } @@ -665,14 +685,17 @@ export default class InitializationService { public async initFluidStatus(): Promise<FluidStatus[]> { const fs = new FluidService(this._client) try { + this._setinitStep(InitSteps.CONSOS) const fluidStatus = await fs.getFluidStatus() if (fluidStatus) { log.info('[Initialization] Fluid Status loaded') return fluidStatus } else { + this._setinitStepError(InitStepsErrors.CONSOS_ERROR) throw new Error('initFluidStatus: fluidStatus not found') } } catch (error) { + this._setinitStepError(InitStepsErrors.CONSOS_ERROR) log.error('Initialization error - initFluidStatus: ', error) throw error } @@ -695,9 +718,11 @@ export default class InitializationService { log.info('[Initialization] Challenges loaded') return userChallengeList } else { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) throw new Error('initUserChallenges: userChallengeList not found') } } catch (error) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) log.error('Initialization error - initUserChallenges: ', error) throw error } @@ -715,40 +740,30 @@ export default class InitializationService { dataloads: Dataload[] }> { const challengeService = new ChallengeService(this._client) - const consumptionService = new ConsumptionDataManager(this._client) try { - const dataloads: Dataload[] = await challengeService.getUserChallengeDataload( - userChallenge - ) - const userConsumption: number = getRoundFloat( - consumptionService.calculatePerformanceIndicatorValue(dataloads) - ) - const _userChallenge: UserChallenge = { - ...userChallenge, - duel: { - ...userChallenge.duel, - userConsumption: userConsumption, - }, - } - const updatedUserChallenge: UserChallenge = await challengeService.updateUserChallenge( - _userChallenge, - UserChallengeUpdateFlag.DUEL_CONSUMPTION - ) + const { + updatedUserChallenge, + dataloads, + } = await challengeService.initChallengeDuelProgress(userChallenge) return { updatedUserChallenge, dataloads } } catch (error) { + this._setinitStepError(InitStepsErrors.CHALLENGES_ERROR) log.error('Initialization error: ', error) throw error } } + public async initConsent(): Promise<TermsStatus> { const termsStatus: TermsStatus = { accepted: false, versionType: 'init', } try { + this._setinitStep(InitSteps.CONSENT) const termService = new TermsService(this._client) const isUpToDate = await termService.isConsentVersionUpToDate() const lastTerm = await termService.getLastTerm() + if (lastTerm) { if (isUpToDate) { const isLastConsentValidated = await termService.isLastTermValidated() @@ -783,6 +798,7 @@ export default class InitializationService { return termsStatus } catch (error) { + this._setinitStepError(InitStepsErrors.CONSENT_ERROR) log.error('Initialization error - initConsent: ', error) throw error } diff --git a/src/services/partnersInfo.service.ts b/src/services/partnersInfo.service.ts index 2ac0111891c3454701445aeb4d637e885d8db7ad..44089bcd3525f00abf893da03cecc8450c298636 100644 --- a/src/services/partnersInfo.service.ts +++ b/src/services/partnersInfo.service.ts @@ -1,12 +1,22 @@ import { Client } from 'cozy-client' +import { InitStepsErrors } from 'models/initialisationSteps.model' import { PartnersInfo } from 'models/partnersInfo.model' import EnvironmentService from './environment.service' export default class PartnersInfoService { private readonly _client: Client + private readonly _setinitStepError: React.Dispatch< + React.SetStateAction<InitStepsErrors | null> + > - constructor(_client: Client) { + constructor( + _client: Client, + _setinitStepError: React.Dispatch< + React.SetStateAction<InitStepsErrors | null> + > + ) { this._client = _client + this._setinitStepError = _setinitStepError } /* @@ -25,6 +35,7 @@ export default class PartnersInfoService { .fetchJSON('GET', remoteUrl) return result as PartnersInfo } catch (error) { + this._setinitStepError(InitStepsErrors.PARTNERS_ERROR) console.error(error) throw new Error("Failed to get partners' info") } diff --git a/src/services/performanceIndicator.service.spec.ts b/src/services/performanceIndicator.service.spec.ts index f68b1d16f0ff3753fc23a7a85234b8d4f329a859..c3cac0a58e72ea131dbe30369473f6b8aecc2bb7 100644 --- a/src/services/performanceIndicator.service.spec.ts +++ b/src/services/performanceIndicator.service.spec.ts @@ -24,9 +24,9 @@ describe('performanceIndicator service', () => { it('should return the current timePeriod and the comparison timePeriod for all timeStep', () => { let expectedResult: PerformanceIndicator = { - value: 5.6091, - compareValue: 7.30015, - percentageVariation: 0.23164592508373127, + value: 5.7911, + compareValue: 7.84615, + percentageVariation: 0.26191826564620857, } let result = performanceIndicatorService.aggregatePerformanceIndicators( performanceIndicator @@ -47,9 +47,9 @@ describe('performanceIndicator service', () => { }, ] expectedResult = { - value: 1.6855999999999998, - compareValue: 4.72185, - percentageVariation: 0.6430212734415537, + value: 1.8675999999999997, + compareValue: 5.26785, + percentageVariation: 0.6454720616570329, } result = performanceIndicatorService.aggregatePerformanceIndicators( performanceIndicator @@ -75,8 +75,8 @@ describe('performanceIndicator service', () => { }, ] expectedResult = { - compareValue: 7.30015, - percentageVariation: 0.44506619726991914, + compareValue: 7.84615, + percentageVariation: 0.48368308023680406, value: 4.0511, } result = performanceIndicatorService.aggregatePerformanceIndicators( @@ -103,7 +103,7 @@ describe('performanceIndicator service', () => { }, ] expectedResult = { - value: 8.7251, + value: 9.2711, compareValue: 0, percentageVariation: -Infinity, } @@ -121,7 +121,7 @@ describe('performanceIndicator service', () => { }, ] expectedResult = { - value: 4.6739999999999995, + value: 5.22, compareValue: 0, percentageVariation: -Infinity, } @@ -140,7 +140,7 @@ describe('performanceIndicator service', () => { ] expectedResult = { value: 0, - compareValue: 2.3369999999999997, + compareValue: 2.61, percentageVariation: 1, } result = performanceIndicatorService.aggregatePerformanceIndicators( diff --git a/src/services/profile.service.ts b/src/services/profile.service.ts index 0f26294564a6af29606ba1438aae38a0d04ad712..32a7c72cad7e3b8115073a6a0872b589422dfb9d 100644 --- a/src/services/profile.service.ts +++ b/src/services/profile.service.ts @@ -29,6 +29,12 @@ export default class ProfileService { partnersIssueDate: DateTime.fromISO(profileEntity.partnersIssueDate, { zone: 'utc', }), + activateHalfHourDate: DateTime.fromISO( + profileEntity.activateHalfHourDate, + { + zone: 'utc', + } + ), } return profile } diff --git a/src/services/queryRunner.service.spec.ts b/src/services/queryRunner.service.spec.ts index 9c6d35c3d5dfc5145e22bb326abce8c07c0174ed..6a33687dd396695377165746c8cb4a495205ffad 100644 --- a/src/services/queryRunner.service.spec.ts +++ b/src/services/queryRunner.service.spec.ts @@ -9,6 +9,7 @@ import { loadYearData } from '../../tests/__mocks__/loadYearData.mock' import { loadMonthData } from '../../tests/__mocks__/loadMonthData.mock' import { loadDayData } from '../../tests/__mocks__/loadDayData.mock' import { loadMinuteData } from '../../tests/__mocks__/loadMinuteData.mock' +import { DataloadState } from 'enum/dataload.enum' describe('queryRunner service', () => { const queryRunner = new QueryRunner(mockClient) @@ -29,6 +30,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 125.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -36,6 +38,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 220.5, + state: DataloadState.VALID, valueDetail: null, }, { @@ -43,6 +46,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 130.33, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -76,6 +80,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 125.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -83,6 +88,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 220.5, + state: DataloadState.VALID, valueDetail: null, }, { @@ -90,6 +96,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 130.33, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -124,6 +131,7 @@ describe('queryRunner service', () => { }), value: 25.25, price: 0.12, + state: DataloadState.VALID, valueDetail: null, }, { @@ -132,6 +140,7 @@ describe('queryRunner service', () => { }), value: 20.5, price: 0.14, + state: DataloadState.VALID, valueDetail: null, }, { @@ -140,6 +149,7 @@ describe('queryRunner service', () => { }), value: 30.33, price: 0.18, + state: DataloadState.VALID, valueDetail: null, }, { @@ -148,6 +158,7 @@ describe('queryRunner service', () => { }), value: 1.22, price: 0.16, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -182,6 +193,7 @@ describe('queryRunner service', () => { }), value: 20.5, price: 0.14, + state: DataloadState.VALID, valueDetail: null, }, { @@ -190,6 +202,7 @@ describe('queryRunner service', () => { }), value: 30.33, price: 0.18, + state: DataloadState.VALID, valueDetail: null, }, { @@ -198,6 +211,7 @@ describe('queryRunner service', () => { }), value: 1.22, price: 0.16, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -231,6 +245,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 4.5, + state: DataloadState.VALID, valueDetail: null, }, { @@ -238,6 +253,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 1.33, + state: DataloadState.VALID, valueDetail: null, }, { @@ -245,6 +261,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 3.22, + state: DataloadState.VALID, valueDetail: null, }, { @@ -252,6 +269,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 7.82, + state: DataloadState.VALID, valueDetail: null, }, { @@ -259,6 +277,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 1.23, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -295,6 +314,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 125.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -302,6 +322,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 220.5, + state: DataloadState.VALID, valueDetail: null, }, { @@ -309,6 +330,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 130.33, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -342,6 +364,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 125.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -349,6 +372,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 220.5, + state: DataloadState.VALID, valueDetail: null, }, { @@ -356,6 +380,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 130.33, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -390,6 +415,7 @@ describe('queryRunner service', () => { }), value: 25.25, price: 0.12, + state: DataloadState.VALID, valueDetail: null, }, { @@ -398,6 +424,7 @@ describe('queryRunner service', () => { }), value: 20.5, price: 0.14, + state: DataloadState.VALID, valueDetail: null, }, { @@ -406,6 +433,7 @@ describe('queryRunner service', () => { }), value: 30.33, price: 0.18, + state: DataloadState.VALID, valueDetail: null, }, { @@ -414,6 +442,7 @@ describe('queryRunner service', () => { }), value: 1.22, price: 0.16, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -448,6 +477,7 @@ describe('queryRunner service', () => { }), value: 20.5, price: 0.14, + state: DataloadState.VALID, valueDetail: null, }, { @@ -456,6 +486,7 @@ describe('queryRunner service', () => { }), value: 30.33, price: 0.18, + state: DataloadState.VALID, valueDetail: null, }, { @@ -464,6 +495,7 @@ describe('queryRunner service', () => { }), value: 1.22, price: 0.16, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -498,6 +530,7 @@ describe('queryRunner service', () => { }), value: 25.25, price: 0.12, + state: DataloadState.VALID, valueDetail: null, }, { @@ -506,6 +539,7 @@ describe('queryRunner service', () => { }), value: 20.5, price: 0.14, + state: DataloadState.VALID, valueDetail: null, }, { @@ -514,6 +548,7 @@ describe('queryRunner service', () => { }), value: 30.33, price: 0.18, + state: DataloadState.VALID, valueDetail: null, }, { @@ -522,6 +557,7 @@ describe('queryRunner service', () => { }), value: 1.22, price: 0.16, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -555,6 +591,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 125.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -562,6 +599,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 220.5, + state: DataloadState.VALID, valueDetail: null, }, { @@ -569,6 +607,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 130.33, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -602,6 +641,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 125.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -609,6 +649,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 220.5, + state: DataloadState.VALID, valueDetail: null, }, { @@ -616,6 +657,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 130.33, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -650,6 +692,7 @@ describe('queryRunner service', () => { }), price: 0.12, value: 25.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -658,6 +701,7 @@ describe('queryRunner service', () => { }), price: 0.14, value: 20.5, + state: DataloadState.VALID, valueDetail: null, }, { @@ -666,6 +710,7 @@ describe('queryRunner service', () => { }), price: 0.18, value: 30.33, + state: DataloadState.VALID, valueDetail: null, }, { @@ -674,6 +719,7 @@ describe('queryRunner service', () => { }), value: 1.22, price: 0.16, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -708,6 +754,7 @@ describe('queryRunner service', () => { }), value: 20.5, price: 0.14, + state: DataloadState.VALID, valueDetail: null, }, { @@ -716,6 +763,7 @@ describe('queryRunner service', () => { }), value: 30.33, price: 0.18, + state: DataloadState.VALID, valueDetail: null, }, { @@ -724,6 +772,7 @@ describe('queryRunner service', () => { }), price: 0.16, value: 1.22, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -758,6 +807,7 @@ describe('queryRunner service', () => { }), price: 0.12, value: 25.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -766,6 +816,7 @@ describe('queryRunner service', () => { }), value: 20.5, price: 0.14, + state: DataloadState.VALID, valueDetail: null, }, { @@ -774,6 +825,7 @@ describe('queryRunner service', () => { }), value: 30.33, price: 0.18, + state: DataloadState.VALID, valueDetail: null, }, { @@ -782,6 +834,7 @@ describe('queryRunner service', () => { }), value: 1.22, price: 0.16, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -815,6 +868,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 125.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -822,6 +876,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 220.5, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -855,6 +910,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 125.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -862,6 +918,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 220.5, + state: DataloadState.VALID, valueDetail: null, }, { @@ -869,6 +926,7 @@ describe('queryRunner service', () => { zone: 'utc', }), value: 130.33, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -903,6 +961,7 @@ describe('queryRunner service', () => { }), price: 0.12, value: 25.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -911,6 +970,7 @@ describe('queryRunner service', () => { }), value: 20.5, price: 0.14, + state: DataloadState.VALID, valueDetail: null, }, { @@ -919,6 +979,7 @@ describe('queryRunner service', () => { }), value: 30.33, price: 0.18, + state: DataloadState.VALID, valueDetail: null, }, { @@ -927,6 +988,7 @@ describe('queryRunner service', () => { }), value: 1.22, price: 0.16, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -961,6 +1023,7 @@ describe('queryRunner service', () => { }), price: 0.12, value: 25.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -969,6 +1032,7 @@ describe('queryRunner service', () => { }), value: 20.5, price: 0.14, + state: DataloadState.VALID, valueDetail: null, }, { @@ -977,6 +1041,7 @@ describe('queryRunner service', () => { }), value: 30.33, price: 0.18, + state: DataloadState.VALID, valueDetail: null, }, { @@ -985,6 +1050,7 @@ describe('queryRunner service', () => { }), value: 1.22, price: 0.16, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -1073,7 +1139,10 @@ describe('queryRunner service', () => { skip: 0, } mockClient.query.mockResolvedValue(mockQueryResult) - const result: number | null = await queryRunner.fetchFluidMaxData( + const result: + | number + | Dataload + | null = await queryRunner.fetchFluidMaxData( mockTimePeriod, TimeStep.DAY, FluidType.ELECTRICITY @@ -1105,7 +1174,10 @@ describe('queryRunner service', () => { mockClient.query .mockResolvedValueOnce(mockQueryResult) .mockResolvedValueOnce(mockQueryResult2) - const result: number | null = await queryRunner.fetchFluidMaxData( + const result: + | number + | Dataload + | null = await queryRunner.fetchFluidMaxData( mockTimePeriod, TimeStep.HALF_AN_HOUR, FluidType.ELECTRICITY @@ -1137,7 +1209,10 @@ describe('queryRunner service', () => { mockClient.query .mockResolvedValueOnce(mockQueryResult) .mockResolvedValueOnce(mockQueryResult2) - const result: number | null = await queryRunner.fetchFluidMaxData( + const result: + | number + | Dataload + | null = await queryRunner.fetchFluidMaxData( mockTimePeriod, TimeStep.HALF_AN_HOUR, FluidType.ELECTRICITY @@ -1155,7 +1230,10 @@ describe('queryRunner service', () => { }), } mockClient.query.mockRejectedValue(new Error()) - const result: number | null = await queryRunner.fetchFluidMaxData( + const result: + | number + | Dataload + | null = await queryRunner.fetchFluidMaxData( mockTimePeriod, TimeStep.DAY, FluidType.ELECTRICITY @@ -1172,7 +1250,10 @@ describe('queryRunner service', () => { zone: 'utc', }), } - const result: number | null = await queryRunner.fetchFluidMaxData( + const result: + | number + | Dataload + | null = await queryRunner.fetchFluidMaxData( mockTimePeriod, TimeStep.DAY, 99 @@ -1189,7 +1270,10 @@ describe('queryRunner service', () => { zone: 'utc', }), } - const result: number | null = await queryRunner.fetchFluidMaxData( + const result: + | number + | Dataload + | null = await queryRunner.fetchFluidMaxData( mockTimePeriod, 99, FluidType.ELECTRICITY @@ -1198,6 +1282,37 @@ describe('queryRunner service', () => { }) }) + describe('getFirstDateData method', () => { + it('should return the first load for elec fluid', async () => { + const firstMockData = [...loadDayData] + firstMockData.sort( + (a, b) => + (a.year - b.year) * 100 + (a.month - b.month) * 10 + (a.day - b.day) + ) + const mockQueryResult: QueryResult<DataloadEntity[]> = { + data: [firstMockData[0]], + bookmark: '', + next: false, + skip: 0, + } + mockClient.query.mockResolvedValue(mockQueryResult) + const result = await queryRunner.getFirstDateData(FluidType.ELECTRICITY) + expect(result).toEqual( + DateTime.local( + loadDayData[0].year, + loadDayData[0].month, + loadDayData[0].day + ).setZone('utc', { keepLocalTime: true }) + ) + }) + + it('should return null when fetch data failed', async () => { + mockClient.query.mockRejectedValue(new Error()) + const result = await queryRunner.getFirstDateData(FluidType.ELECTRICITY) + expect(result).toBeNull() + }) + }) + describe('getLastDateData method', () => { it('should return the last load for elec fluid', async () => { const lastMockData = [...loadDayData] diff --git a/src/services/queryRunner.service.ts b/src/services/queryRunner.service.ts index f9733ef3d9057b040d7c3347483a23ffc9f866a2..1fae7902ebd897dd3a8f10ddc5d88faa75e9c8b2 100644 --- a/src/services/queryRunner.service.ts +++ b/src/services/queryRunner.service.ts @@ -19,6 +19,7 @@ import { TimeStep } from 'enum/timeStep.enum' import { Dataload, TimePeriod } from 'models' import { QueryResult } from 'cozy-client/types/types' import log from 'utils/logger' +import { DataloadState } from 'enum/dataload.enum' export default class QueryRunner { // TODO to be clean up @@ -87,15 +88,26 @@ export default class QueryRunner { if (timeStep === TimeStep.HALF_AN_HOUR) { return Q(doctype) .where(this.getPredicate(maxTimePeriod, TimeStep.HALF_AN_HOUR)) + .indexFields(['load']) .limitBy(1) .sortBy([{ load: 'desc' }]) } return Q(doctype) .where(this.getPredicate(maxTimePeriod, timeStep)) + .indexFields(['load']) .limitBy(limit) .sortBy([{ load: 'desc' }]) } + private buildFirstDateQuery(fluidType: FluidType, limit: number) { + const doctype = this.getRelevantDoctype(fluidType, TimeStep.DAY) + return Q(doctype) + .where({}) + .indexFields(['year', 'month', 'day']) + .sortBy([{ year: 'asc' }, { month: 'asc' }, { day: 'asc' }]) + .limitBy(limit) + } + private buildLastDateQuery(fluidType: FluidType, limit: number) { const doctype = this.getRelevantDoctype(fluidType, TimeStep.DAY) return Q(doctype) @@ -146,10 +158,10 @@ export default class QueryRunner { keepLocalTime: true, }), value: entry.load, + state: DataloadState.VALID, price: entry.price, valueDetail: null, })) - return mappedResult } @@ -401,6 +413,32 @@ export default class QueryRunner { return null } + public async getFirstDateData( + fluidType: FluidType + ): Promise<DateTime | null> { + const query: QueryDefinition = this.buildFirstDateQuery(fluidType, 1) + const result = await this.fetchData(query) + if ( + result && + result.data && + result.data[0] && + result.data[0].year && + result.data[0].month && + result.data[0].day + ) { + return DateTime.local( + result.data[0].year, + result.data[0].month, + result.data[0].day, + result.data[0].hour ? result.data[0].hour : 0, + result.data[0].minute ? result.data[0].minute : 0 + ).setZone('utc', { + keepLocalTime: true, + }) + } + return null + } + public async getLastDateData(fluidType: FluidType): Promise<DateTime | null> { const query: QueryDefinition = this.buildLastDateQuery(fluidType, 1) const result = await this.fetchData(query) @@ -415,7 +453,9 @@ export default class QueryRunner { return DateTime.local( result.data[0].year, result.data[0].month, - result.data[0].day + result.data[0].day, + result.data[0].hour ? result.data[0].hour : 0, + result.data[0].minute ? result.data[0].minute : 0 ).setZone('utc', { keepLocalTime: true, }) diff --git a/src/services/quiz.service.spec.ts b/src/services/quiz.service.spec.ts index a17871364287e3c0be7bd3cb7b9c81d031b3906d..bbaa8a1a3fa6372c647b2921cf6c13313cebfc03 100644 --- a/src/services/quiz.service.spec.ts +++ b/src/services/quiz.service.spec.ts @@ -423,6 +423,7 @@ describe('Quiz service', () => { TimeStep.MONTH, [FluidType.ELECTRICITY], undefined, + undefined, true ) expect(result).toEqual(expected) diff --git a/src/services/quiz.service.ts b/src/services/quiz.service.ts index 1749a5edcd23c9aaf72c063d6404d0be3ee4e6aa..831ab75352afb725269863e231573faf4341bfce 100644 --- a/src/services/quiz.service.ts +++ b/src/services/quiz.service.ts @@ -521,6 +521,7 @@ export default class QuizService { timeStep, fluidType, undefined, + undefined, !singleFluid ) let average = 0 diff --git a/src/services/triggers.service.spec.ts b/src/services/triggers.service.spec.ts index ea078b3bc6a2bb45cd21756c67772a77783316e6..4bf034287a3abbf692655727aa9f10d26dfb9e40 100644 --- a/src/services/triggers.service.spec.ts +++ b/src/services/triggers.service.spec.ts @@ -62,6 +62,36 @@ describe('TriggerService service', () => { }) }) + describe('getTriggerForAccount method', () => { + it('should return Trigger', async () => { + const mockQueryResult: QueryResult<Trigger[]> = { + data: [triggersData[0]], + bookmark: '', + next: false, + skip: 0, + } + mockClient.query.mockResolvedValueOnce(mockQueryResult) + const result: Trigger | null = await triggerService.getTriggerForAccount( + accountsData[0] + ) + expect(result).toEqual(triggersData[0]) + }) + + it('should return null when no trigger found', async () => { + const mockQueryResult: QueryResult<Trigger[]> = { + data: [], + bookmark: '', + next: false, + skip: 0, + } + mockClient.query.mockResolvedValueOnce(mockQueryResult) + const result: Trigger | null = await triggerService.getTriggerForAccount( + accountsData[0] + ) + expect(result).toBe(null) + }) + }) + describe('fetchTriggerState method', () => { it('should return Trigger state', async () => { const mockResult = { @@ -100,4 +130,27 @@ describe('TriggerService service', () => { } }) }) + + describe('deleteTrigger method', () => { + it('should return true when destroy successfully', async () => { + const mockDetroyResult: QueryResult<Trigger[]> = { + data: [], + bookmark: '', + next: false, + skip: 0, + } + mockClient.destroy.mockResolvedValueOnce(mockDetroyResult) + const result = await triggerService.deleteTrigger(triggersData[0]) + expect(result).toBe(true) + }) + + it('should throw error when destroy unsuccessfully', async () => { + mockClient.destroy.mockRejectedValueOnce(new Error()) + try { + await triggerService.deleteTrigger(triggersData[0]) + } catch (error) { + expect(error).toEqual(new Error('Delete trigger failed')) + } + }) + }) }) diff --git a/src/services/triggers.service.ts b/src/services/triggers.service.ts index 74bd3f558dcff8cedc3f8cc5afb95303018e974a..fae71f7d70999a8ab541182628d46b007dc6c559 100644 --- a/src/services/triggers.service.ts +++ b/src/services/triggers.service.ts @@ -50,6 +50,7 @@ export default class TriggerService { 'message.account': account._id, 'message.konnector': konnector.slug, }) + .indexFields(['cozyMetadata.updatedAt']) .sortBy([{ 'cozyMetadata.updatedAt': 'desc' }]) .limitBy(1) const { data: triggers }: QueryResult<Trigger[]> = await this._client.query( @@ -58,6 +59,21 @@ export default class TriggerService { return triggers[0] ? triggers[0] : null } + public async getTriggerForAccount(account: Account): Promise<Trigger | null> { + const query: QueryDefinition = Q(TRIGGERS_DOCTYPE) + .where({ + 'message.account': account._id, + 'message.konnector': account.account_type, + }) + .indexFields(['cozyMetadata.createdAt']) + .sortBy([{ 'cozyMetadata.createdAt': 'desc' }]) + .limitBy(1) + const { data: triggers }: QueryResult<Trigger[]> = await this._client.query( + query + ) + return triggers[0] ? triggers[0] : null + } + public async fetchTriggerState( trigger: Trigger ): Promise<TriggerState | null> { @@ -73,4 +89,14 @@ export default class TriggerService { throw new Error('Fetch trigger state failed') } } + + public async deleteTrigger(trigger: Trigger): Promise<boolean> { + try { + await this._client.destroy(trigger) + return true + } catch (error) { + console.log(error) + throw new Error('Delete trigger failed') + } + } } diff --git a/src/store/global/global.actions.ts b/src/store/global/global.actions.ts index ae47957ff5f3f41d33b7d48e0ad79ab10bbd1c77..294d00f0a458c5eb7156ac7377d99f8cc3799b5a 100644 --- a/src/store/global/global.actions.ts +++ b/src/store/global/global.actions.ts @@ -16,7 +16,7 @@ export const SET_FLUID_STATUS = 'SET_FLUID_STATUS' export const UPDATE_FLUID_CONNECTION = 'UPDATE_FLUID_CONNECTION' export const UPDATE_TERMS_VALIDATION = 'UPDATE_TERMS_VALIDATION' export const SET_PARTNERS_ISSUE = 'SET_PARTNERS_ISSUE' - +export const SET_SHOULD_REFRESH_CONSENT = 'SET_SHOULD_REFRESH_CONSENT' interface ChangeScreenType { type: typeof CHANGE_SCREEN_TYPE payload?: ScreenType @@ -67,6 +67,11 @@ interface SetPartnersIssue { payload?: boolean } +interface SetShouldRefreshConsent { + type: typeof SET_SHOULD_REFRESH_CONSENT + payload?: boolean +} + export type GlobalActionTypes = | ChangeScreenType | ToogleChallengeExplorationNotification @@ -78,6 +83,7 @@ export type GlobalActionTypes = | UpdateTermValidation | ShowReleaseNotes | SetPartnersIssue + | SetShouldRefreshConsent export function changeScreenType(screenType: ScreenType): GlobalActionTypes { return { @@ -163,3 +169,11 @@ export function setPartnersIssue( payload: openPartnersIssueModal, } } +export function setShouldRefreshConsent( + shouldRefreshConsent: boolean +): GlobalActionTypes { + return { + type: SET_SHOULD_REFRESH_CONSENT, + payload: shouldRefreshConsent, + } +} diff --git a/src/store/global/global.reducer.spec.ts b/src/store/global/global.reducer.spec.ts index 600ac0f12af64ba245ac6adbec3765d88d63427e..23cb3d1d1343eef67f175990ec2a368c0bfa059c 100644 --- a/src/store/global/global.reducer.spec.ts +++ b/src/store/global/global.reducer.spec.ts @@ -16,7 +16,7 @@ import { accountsData } from '../../../tests/__mocks__/accountsData.mock' import { triggersData } from '../../../tests/__mocks__/triggersData.mock' import { mockInitialGlobalState } from '../../../tests/__mocks__/store' -const mockLastDataDates: (DateTime | null)[] = [ +const mockDataDates: (DateTime | null)[] = [ DateTime.local().setZone('utc', { keepLocalTime: true, }), @@ -130,7 +130,8 @@ describe('global reducer', () => { { fluidType: FluidType.ELECTRICITY, status: FluidState.ERROR, - lastDataDate: mockLastDataDates[FluidType.ELECTRICITY], + firstDataDate: mockDataDates[FluidType.ELECTRICITY], + lastDataDate: mockDataDates[FluidType.ELECTRICITY], connection: { konnector: konnectorsData[0], account: accountsData[0], @@ -150,7 +151,8 @@ describe('global reducer', () => { { fluidType: FluidType.WATER, status: FluidState.ERROR, - lastDataDate: mockLastDataDates[FluidType.WATER], + firstDataDate: mockDataDates[FluidType.WATER], + lastDataDate: mockDataDates[FluidType.WATER], connection: { konnector: konnectorsData[1], account: accountsData[1], @@ -171,7 +173,8 @@ describe('global reducer', () => { { fluidType: FluidType.GAS, status: FluidState.KONNECTOR_NOT_FOUND, - lastDataDate: mockLastDataDates[FluidType.GAS], + firstDataDate: mockDataDates[FluidType.GAS], + lastDataDate: mockDataDates[FluidType.GAS], connection: { konnector: null, account: accountsData[2], diff --git a/src/store/global/global.reducer.ts b/src/store/global/global.reducer.ts index 13dad1217de374bd62115448056ffb4681f2b4f5..0bbbbc10aa323af51df0cf642dc6c721fd93ebd4 100644 --- a/src/store/global/global.reducer.ts +++ b/src/store/global/global.reducer.ts @@ -11,6 +11,7 @@ import { UPDATE_TERMS_VALIDATION, SHOW_RELEASE_NOTES, SET_PARTNERS_ISSUE, + SET_SHOULD_REFRESH_CONSENT, } from 'store/global/global.actions' import { FluidStatus, GlobalState } from 'models' import { ScreenType } from 'enum/screen.enum' @@ -39,6 +40,7 @@ const initialState: GlobalState = { { fluidType: FluidType.ELECTRICITY, status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: null, lastDataDate: null, connection: { shouldLaunchKonnector: false, @@ -59,6 +61,7 @@ const initialState: GlobalState = { { fluidType: FluidType.WATER, status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: null, lastDataDate: null, connection: { shouldLaunchKonnector: false, @@ -79,6 +82,7 @@ const initialState: GlobalState = { { fluidType: FluidType.GAS, status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: null, lastDataDate: null, connection: { shouldLaunchKonnector: false, @@ -99,6 +103,7 @@ const initialState: GlobalState = { ], fluidTypes: [], openPartnersIssueModal: false, + shouldRefreshConsent: false, } const getFluidTypesFromStatus = (fluidStatus: FluidStatus[]): FluidType[] => { @@ -184,6 +189,13 @@ export const globalReducer: Reducer<GlobalState> = ( openPartnersIssueModal: action.payload, } : state + case SET_SHOULD_REFRESH_CONSENT: + return action.payload != undefined + ? { + ...state, + shouldRefreshConsent: action.payload, + } + : state case UPDATE_FLUID_CONNECTION: if (action.payload !== undefined) { const updatedFluidStatus = [...state.fluidStatus] diff --git a/src/store/profile/profile.reducer.ts b/src/store/profile/profile.reducer.ts index 8334f1a684c59b14e55bf1dca82d547533851e23..29f92540519b2612bae94dde63e2d4f5e6411e05 100644 --- a/src/store/profile/profile.reducer.ts +++ b/src/store/profile/profile.reducer.ts @@ -28,6 +28,7 @@ const initialState: Profile = { isWelcomeSeen: false, }, haveSeenEcogestureModal: false, + activateHalfHourDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), } export const profileReducer: Reducer<Profile> = ( diff --git a/src/targets/services/consumptionAlert.ts b/src/targets/services/consumptionAlert.ts index b34de110bd51705caea590d50adc2844d8fc1379..890094a4f556d14284177812efb1c25cf606c889 100644 --- a/src/targets/services/consumptionAlert.ts +++ b/src/targets/services/consumptionAlert.ts @@ -1,104 +1,109 @@ -import logger from 'cozy-logger' -import { Client } from 'cozy-client' -import get from 'lodash/get' -import { runService } from './service' -import ProfileService from 'services/profile.service' -import MailService from 'services/mail.service' -import { DateTime } from 'luxon' -const consumptionLimit = require('notifications/consumptionLimit.hbs') -import mjml2html from 'mjml' -import { FluidType } from 'enum/fluid.enum' -import ConsumptionService from 'services/consumption.service' -import { getPreviousMonthName } from 'utils/utils' -import EnvironmentService from 'services/environment.service' - -const log = logger.namespace('alert') - -interface ConsumptionAlertProps { - client: Client -} - -// Only monitoring WATER fluid for now -const consumptionAlert = async ({ client }: ConsumptionAlertProps) => { - log('info', 'Fetching user profile...') - const upm = new ProfileService(client) - const consumptionService = new ConsumptionService(client) - const userProfil = await upm.getProfile() - if ( - !userProfil || - !userProfil.sendConsumptionAlert || - userProfil.waterDailyConsumptionLimit === 0 - ) { - log( - 'info', - 'End of process - Alert report notification is disabled or lack informations from user profile to run' - ) - return - } - - let username = '' - - log('info', 'water limit is :' + userProfil.waterDailyConsumptionLimit) - - log('info', 'Fetching fluid data...') - // Retrieve public name from the stack - const settings = await client - .getStackClient() - .fetchJSON('GET', '/settings/instance') - const publicName = get(settings, 'data.attributes.public_name') - if (publicName) { - username = publicName - } - - // Retrieve link to ecolyo app from the stack - const apps = await client.getStackClient().fetchJSON('GET', '/apps/ecolyo') - const appLink = get(apps, 'data.links.related') - - const fetchedData = await consumptionService.getLastDataload(FluidType.WATER) - let lastDayValue = 0 - if (fetchedData && fetchedData.length > 0) { - fetchedData.forEach(element => { - if (element.value) { - lastDayValue = element.value - } - }) - } - if (lastDayValue <= userProfil.waterDailyConsumptionLimit) { - log( - 'info', - 'End of process - Limit consumption set by the user has not been passed.' - ) - return - } - - log('info', 'Creation of mail...') - const mailService = new MailService() - const today = DateTime.local().setZone('utc', { keepLocalTime: true }) - - const environmentService = new EnvironmentService() - const template = consumptionLimit({ - title: 'Ça déborde !', - baseUrl: environmentService.getPublicURL(), - username: username, - clientUrl: `${appLink}/#/consumption/water`, - unsubscribeUrl: `${appLink}/#/options`, - userLimit: userProfil.waterDailyConsumptionLimit, - limitDate: `${today.day} ${getPreviousMonthName(today)}`, - }) - - const mailData = { - mode: 'noreply', - subject: '[Ecolyo] - Ça déborde !', - parts: [ - { - type: 'text/html', - body: mjml2html(template).html, - }, - ], - } - - log('info', 'Sending mail...') - mailService.SendMail(client, mailData) -} - -runService(consumptionAlert) +import logger from 'cozy-logger' +import { Client } from 'cozy-client' +import get from 'lodash/get' +import { runService } from './service' +import ProfileService from 'services/profile.service' +import MailService from 'services/mail.service' +import { DateTime } from 'luxon' +const consumptionLimit = require('notifications/consumptionLimit.hbs') +import mjml2html from 'mjml' +import { FluidType } from 'enum/fluid.enum' +import ConsumptionService from 'services/consumption.service' +import { getPreviousMonthName } from 'utils/utils' +import EnvironmentService from 'services/environment.service' + +const log = logger.namespace('alert') + +interface ConsumptionAlertProps { + client: Client +} + +// Only monitoring WATER fluid for now +const consumptionAlert = async ({ client }: ConsumptionAlertProps) => { + log('info', 'Fetching user profile...') + const upm = new ProfileService(client) + const consumptionService = new ConsumptionService(client) + const userProfil = await upm.getProfile() + if ( + !userProfil || + !userProfil.sendConsumptionAlert || + userProfil.waterDailyConsumptionLimit === 0 + ) { + log( + 'info', + 'End of process - Alert report notification is disabled or lack informations from user profile to run' + ) + return + } + + let username = '' + + log('info', 'water limit is :' + userProfil.waterDailyConsumptionLimit) + + log('info', 'Fetching fluid data...') + // Retrieve public name from the stack + const settings = await client + .getStackClient() + .fetchJSON('GET', '/settings/instance') + const publicName = get(settings, 'data.attributes.public_name') + if (publicName) { + username = publicName + } + + // Retrieve link to ecolyo app from the stack + const apps = await client.getStackClient().fetchJSON('GET', '/apps/ecolyo') + const appLink = get(apps, 'data.links.related') + + const fetchedData = await consumptionService.getLastDataload(FluidType.WATER) + let lastDayValue = 0 + let alertDay: DateTime = DateTime.local().setZone('utc', { + keepLocalTime: true, + }) + if (fetchedData && fetchedData.length > 0) { + fetchedData.forEach(element => { + if (element.value) { + lastDayValue = element.value + } + if (element.date) { + alertDay = element.date + } + }) + } + if (lastDayValue <= userProfil.waterDailyConsumptionLimit) { + log( + 'info', + 'End of process - Limit consumption set by the user has not been passed.' + ) + return + } + + log('info', 'Creation of mail...') + const mailService = new MailService() + + const environmentService = new EnvironmentService() + const template = consumptionLimit({ + title: 'Ça déborde !', + baseUrl: environmentService.getPublicURL(), + username: username, + clientUrl: `${appLink}/#/consumption/water`, + unsubscribeUrl: `${appLink}/#/options`, + userLimit: userProfil.waterDailyConsumptionLimit, + limitDate: `${alertDay.day} ${getPreviousMonthName(alertDay)}`, + }) + + const mailData = { + mode: 'noreply', + subject: '[Ecolyo] - Ça déborde !', + parts: [ + { + type: 'text/html', + body: mjml2html(template).html, + }, + ], + } + + log('info', 'Sending mail...') + mailService.SendMail(client, mailData) +} + +runService(consumptionAlert) diff --git a/src/targets/services/enedisHalfHourMonthlyAnalysis.ts b/src/targets/services/enedisHalfHourMonthlyAnalysis.ts index c56a6a79364388d9c435360b3a7d14ce9143132c..e7f269b51af3d40f51cf2d904da580f68289da5d 100644 --- a/src/targets/services/enedisHalfHourMonthlyAnalysis.ts +++ b/src/targets/services/enedisHalfHourMonthlyAnalysis.ts @@ -156,8 +156,8 @@ const getEnedisMonthAnalysisData = async ( year: year, }).daysInMonth monthlyAveragesLoads.minimumLoad = getMinMonthlyLoad( - weekValuesArray, weekEndValuesArray, + weekValuesArray, numberofDaysInMonth ) const arrAvg = (arr: number[]) => @@ -195,7 +195,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({ )) as DataloadEntity[] const lastEnedisMonthlyAnalysis = await emas.getLastEnedisMonthlyAnalysis() - if (firstMinuteData) { + if (firstMinuteData && firstMinuteData[0]) { //First creates the analysis of the month - 1 log('info', 'Fetching last Enedis monthly Analysis...') const firstMinuteDate = DateTime.fromObject({ @@ -293,6 +293,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({ 'info', 'Enedis Minute is not activated or there is no data yet in this doctype' ) + return } } diff --git a/src/targets/services/fluidsPrices.ts b/src/targets/services/fluidsPrices.ts index 32a9e11d1e82771656ec72055a2c37b2de2f9eeb..a57025562299f7b6c79f78f858c3a68803ffa06b 100644 --- a/src/targets/services/fluidsPrices.ts +++ b/src/targets/services/fluidsPrices.ts @@ -3,20 +3,108 @@ import { Client } from 'cozy-client' import { runService } from './service' import { DateTime } from 'luxon' import FluidPricesService from 'services/fluidsPrices.service' -import { DataloadEntity, TimePeriod } from 'models' +import { DataloadEntity, FluidPrice, TimePeriod } from 'models' import ConsumptionDataManager from 'services/consumption.service' import { TimeStep } from 'enum/timeStep.enum' import { ENEDIS_DAY_DOCTYPE, GRDF_DAY_DOCTYPE, EGL_DAY_DOCTYPE } from 'doctypes' import { FluidType } from 'enum/fluid.enum' import QueryRunner from 'services/queryRunner.service' +import EnvironmentService from 'services/environment.service' const log = logger.namespace('fluidPrices') interface PricesProps { client: Client } -const price = (item: DataloadEntity): number | null => { - return item.price ? item.price : null +const getRemotePricesByfluid = async ( + client: Client, + fluidType: FluidType +): Promise<FluidPrice[]> => { + const env = new EnvironmentService() + const remoteUrl = env.isProduction() + ? `/remote/org.ecolyo.backoffice.prices` + : `/remote/org.ecolyo.backoffice.prices.rec` + const prices = await client + .getStackClient() + .fetchJSON('GET', `${remoteUrl}?fluidtype=${fluidType}`) + return prices +} + +/** + * Synchro the remote prices with database and returns a date where we have to relaunch aggregation if a price has been edited in backoffice + * @param {Client} client + * @param {FluidType} fluidType + * @returns {string | null} the oldest startDate + */ +const synchroPricesToUpdate = async ( + client: Client, + fluidType: FluidType +): Promise<string | null> => { + const fps = new FluidPricesService(client) + const remotePrices = await getRemotePricesByfluid(client, fluidType) + let firstEditedPrice: string | null = null + await Promise.all( + remotePrices.map(async remotePrice => { + return new Promise<void>(async resolve => { + try { + //Check if price exist in database + const existingPrice = await fps.checkIfPriceExists(remotePrice) + if (existingPrice) { + //Check if the remote price is more recent + if ( + existingPrice.UpdatedAt && + remotePrice.UpdatedAt && + existingPrice.UpdatedAt < remotePrice.UpdatedAt + ) { + log('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 (firstEditedPrice === null) { + firstEditedPrice = remotePrice.startDate + } + if (firstEditedPrice >= remotePrice.startDate) { + firstEditedPrice = remotePrice.startDate + } + + //update this price in db + await fps.updatePrice(existingPrice, { + price: remotePrice.price, + UpdatedAt: remotePrice.UpdatedAt, + startDate: remotePrice.startDate, + endDate: remotePrice.endDate, + }) + } else if (!existingPrice.UpdatedAt && remotePrice.UpdatedAt) { + //updatedAt key doesn't exist in db + await fps.updatePrice(existingPrice, { + UpdatedAt: remotePrice.UpdatedAt, + }) + } else { + log('debug', `Price up to date`) + } + } else { + log('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 (firstEditedPrice === null) { + firstEditedPrice = remotePrice.startDate + } + if (firstEditedPrice >= remotePrice.startDate) { + firstEditedPrice = remotePrice.startDate + } + //create price in db + await fps.createPrice(remotePrice) + } + } catch (err) { + log('error', `Error: ${err}`) + } finally { + resolve() + } + }) + }) + ) + return firstEditedPrice +} + +const price = (item: DataloadEntity): number => { + return item.price ? item.price : 0 } const sum = (prev: number, next: number): number => { @@ -51,7 +139,6 @@ const getTimePeriod = async ( } const aggregatePrices = async ( - client: Client, qr: QueryRunner, cdm: ConsumptionDataManager, firstDate: DateTime, @@ -59,41 +146,47 @@ const aggregatePrices = async ( fluidType: FluidType ) => { const tsa = [TimeStep.MONTH, TimeStep.YEAR] - log('debug', `Aggregation...`) - const aggregatePromises = tsa.map(async ts => { - return new Promise<void>(async resolve => { - let date: DateTime = DateTime.local() - Object.assign(date, firstDate) - do { - log( - 'debug', - `Step: ${ts} | Fluid: ${fluidType} | Date: ${date.day}/${date.month}/${date.year}` - ) - const tp = await getTimePeriod(ts, date) - // Get doc for aggregation - const data = await qr.fetchFluidRawDoctype(tp, TimeStep.DAY, fluidType) - - // Get doc to update - const docToUpdate = await qr.fetchFluidRawDoctype(tp, ts, fluidType) - - if (docToUpdate && data && docToUpdate.data && data.data) { - docToUpdate.data[0].price = data.data.map(price).reduce(sum) - } + log( + 'debug', + `Aggregation started for fluid: ${fluidType}, from ${firstDate} ` + ) + await Promise.all( + tsa.map(async ts => { + return new Promise<void>(async resolve => { + let date: DateTime = DateTime.local() + Object.assign(date, firstDate) + try { + do { + const tp = await getTimePeriod(ts, date) + // Get doc for aggregation + const data = await qr.fetchFluidRawDoctype( + tp, + TimeStep.DAY, + fluidType + ) + // Get doc to update + const docToUpdate = await qr.fetchFluidRawDoctype(tp, ts, fluidType) - // Save updated docs - await cdm.saveDocs(docToUpdate.data) - // Update date according to timestep - if (ts === TimeStep.YEAR) { - date = date.plus({ year: 1 }).startOf('month') - } else { - date = date.plus({ month: 1 }).startOf('month') + if (docToUpdate && data && docToUpdate.data && data.data) { + docToUpdate.data[0].price = data.data.map(price).reduce(sum) + } + // Save updated docs + await cdm.saveDocs(docToUpdate.data) + // Update date according to timestep + if (ts === TimeStep.YEAR) { + date = date.plus({ year: 1 }).startOf('month') + } else { + date = date.plus({ month: 1 }).startOf('month') + } + } while (date < today) + } catch (err) { + log('info', `Error : ${err}`) + } finally { + resolve() } - } while (date < today) - resolve() + }) }) - }) - - await Promise.all(aggregatePromises) + ) log('debug', `Aggregation done`) } @@ -128,6 +221,10 @@ const applyPrices = async (client: Client, fluidType: FluidType) => { const fluidsPricesService = new FluidPricesService(client) const cdm = new ConsumptionDataManager(client) const qr = new QueryRunner(client) + + //Synchro dbprices with remote prices + const firstEditedPriceDate = await synchroPricesToUpdate(client, fluidType) + const firstDataDate = await cdm.fetchAllFirstDateData([fluidType]) const prices = await fluidsPricesService.getAllPrices() // Prices data exsit if (prices.length > 0) { @@ -135,65 +232,109 @@ const applyPrices = async (client: Client, fluidType: FluidType) => { const firstMinuteData = await cdm.getFirstDataDateFromDoctypeWithPrice( getDoctypeTypeByFluid(fluidType) ) + // const firstDoctypeData = await cdm.getFirsDataDateFromDoctype() // If there is data, update hourly data and daily data - if (firstMinuteData) { - // Format first date - const firstDate = DateTime.fromObject({ - year: firstMinuteData.year, - month: firstMinuteData.month, - day: firstMinuteData.day, - }) + if ( + firstDataDate && + firstDataDate[0] && + (firstMinuteData || firstEditedPriceDate !== null) + ) { const today = DateTime.now() const tsa = getTimeSetByFluid(fluidType) + let firstDate: DateTime - // Hourly and daily prices - const promises = tsa.map(async timeStep => { - return new Promise<void>(async resolve => { - let date: DateTime = DateTime.local() - Object.assign(date, firstDate) - do { - // Get price - const priceData = await fluidsPricesService.getPrices( - fluidType, - date - ) - // log( - // 'debug', - // `Step: ${timeStep} | Fluid : ${fluidType} | Date: ${date.day}/${date.month}/${date.year} | Price: ${priceData.price}` - // ) - const tp = await getTimePeriod(timeStep, date) + if (firstMinuteData && firstEditedPriceDate) { + // If there is first data without price and a price edited, set the smallest date + const firstMinuteDataDate = DateTime.fromObject({ + year: firstMinuteData.year, + month: firstMinuteData.month, + day: firstMinuteData.day, + }).setZone('utc', { + keepLocalTime: true, + }) + const formattedFirstEditedPrice = DateTime.fromISO( + firstEditedPriceDate + ).setZone('utc', { + keepLocalTime: true, + }) + // we want to exclude the period with no data if the edited date is smaller than the first data date + firstDate = DateTime.min( + DateTime.max(formattedFirstEditedPrice, firstDataDate[0]), + firstMinuteDataDate + ) + } else if (firstMinuteData) { + firstDate = DateTime.fromObject({ + year: firstMinuteData.year, + month: firstMinuteData.month, + day: firstMinuteData.day, + }).setZone('utc', { + keepLocalTime: true, + }) + } else if (firstEditedPriceDate) { + firstDate = DateTime.max( + DateTime.fromISO(firstEditedPriceDate).setZone('utc', { + keepLocalTime: true, + }), + firstDataDate[0] + ) + } else { + firstDate = today + } - // Get doc to update - const data = await qr.fetchFluidRawDoctype(tp, timeStep, fluidType) - - // If lastItem has a price, skip this day (in order to save perf) - const lastItem = data.data[data.data.length - 1] - if (lastItem && !lastItem.price && priceData) { - data && - data.data.forEach((element: DataloadEntity) => { - element.price = element.load * priceData.price - }) - - // Save updated docs - await cdm.saveDocs(data.data) - } + // Hourly and daily prices + await Promise.all( + tsa.map(async timeStep => { + return new Promise<void>(async resolve => { + let date: DateTime = DateTime.local().setZone('utc', { + keepLocalTime: true, + }) + Object.assign(date, firstDate) + try { + do { + // Get price + const priceData = await fluidsPricesService.getPrices( + fluidType, + date + ) + const tp = await getTimePeriod(timeStep, date) + // Get doc to update + const data = await qr.fetchFluidRawDoctype( + tp, + timeStep, + fluidType + ) - // Update date - if (timeStep === TimeStep.HALF_AN_HOUR) { - date = date.plus({ days: 1 }) - } else { - date = date.plus({ month: 1 }).startOf('month') + // If lastItem has a price, skip this day (in order to save perf) + const lastItem = + data && 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 + data && + data.data.forEach((element: DataloadEntity) => { + element.price = element.load * priceData.price + }) + // Save updated docs + await cdm.saveDocs(data.data) + } + // Update date + if (timeStep === TimeStep.HALF_AN_HOUR) { + date = date.plus({ days: 1 }) + } else { + date = date.plus({ month: 1 }).startOf('month') + } + } while (date < today) + } catch (err) { + log('error', `ERROR : ${err} `) + } finally { + resolve() } - } while (date < today) - resolve() + }) }) - }) - - await Promise.all(promises) + ) // Call aggregation method - await aggregatePrices(client, qr, cdm, firstDate, today, fluidType) + await aggregatePrices(qr, cdm, firstDate, today, fluidType) } else log('info', `No data found for fluid ${fluidType}`) } else log('info', 'No fluidesPrices data') } diff --git a/src/targets/services/monthlyReportNotification.ts b/src/targets/services/monthlyReportNotification.ts index 630f7381ef80300a049c2d1b3572e3a80c388935..6ba377a2a426f2111e005ba7fdde5c193620e461 100644 --- a/src/targets/services/monthlyReportNotification.ts +++ b/src/targets/services/monthlyReportNotification.ts @@ -11,7 +11,7 @@ const monthlyReportTemplate = require('notifications/monthlyReport.hbs') import { FluidType } from 'enum/fluid.enum' import { TimeStep } from 'enum/timeStep.enum' import ConsumptionService from 'services/consumption.service' -import { MonthlReport } from 'models/monthlyReport.model' +import { MonthlyReport } from 'models/monthlyReport.model' import EnvironmentService from 'services/environment.service' import { getMonthNameWithPrep } from 'utils/utils' @@ -130,7 +130,7 @@ const getMonthlyReport = async ( year: string, month: string, client: Client -): Promise<MonthlReport> => { +): Promise<MonthlyReport> => { try { const environmentService = new EnvironmentService() log( @@ -154,6 +154,7 @@ const getMonthlyReport = async ( return { year: parseInt(year), month: parseInt(month), + subject: '', info: '', image: '', newsTitle: 'Les nouveautés du service', @@ -219,7 +220,7 @@ const monthlyReportNotification = async ({ }) const month = today.toFormat('MM') const year = today.toFormat('yyyy') - const monthlyReport: MonthlReport = await getMonthlyReport( + const monthlyReport: MonthlyReport = await getMonthlyReport( year, month, client @@ -286,9 +287,7 @@ const monthlyReportNotification = async ({ const mailData = { mode: 'noreply', - subject: `[Ecolyo] Votre bilan mensuel ${getMonthNameWithPrep(date)} ${ - date.year - }`, + subject: monthlyReport.subject, parts: [ { type: 'text/html', diff --git a/tests/__mocks__/datachartData.mock.ts b/tests/__mocks__/datachartData.mock.ts index de82121d074b8bc6fd5730a408eee99e68142ffc..4fd3ddd29cfa1692333444f391143f65949d0aaf 100644 --- a/tests/__mocks__/datachartData.mock.ts +++ b/tests/__mocks__/datachartData.mock.ts @@ -1,5 +1,6 @@ import { Datachart, Dataload } from 'models' import { DateTime } from 'luxon' +import { DataloadState } from 'enum/dataload.enum' export const graphData: Datachart = { actualData: [ @@ -8,20 +9,31 @@ export const graphData: Datachart = { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-02T00:00:00.000Z', { zone: 'utc', }), value: 61.65554999999999, - valueDetail: [40.21918999999999, 0.8064649999999999, 20.629894999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 40.21918999999999, state: DataloadState.VALID }, + { value: 0.8064649999999999, state: DataloadState.VALID }, + { value: 20.629894999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-03T00:00:00.000Z', { zone: 'utc', }), value: -1, + state: DataloadState.EMPTY, valueDetail: null, }, ], @@ -31,20 +43,31 @@ export const graphData: Datachart = { zone: 'utc', }), value: 54.090509999999995, - valueDetail: [35.284358, 0.707513, 18.098639], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 35.284358, state: DataloadState.VALID }, + { value: 0.707513, state: DataloadState.VALID }, + { value: 18.098639, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-09-02T00:00:00.000Z', { zone: 'utc', }), value: 56.57427, - valueDetail: [36.904565999999996, 0.740001, 18.929703], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 36.904565999999996, state: DataloadState.VALID }, + { value: 0.740001, state: DataloadState.VALID }, + { value: 18.929703, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-09-03T00:00:00.000Z', { zone: 'utc', }), value: -1, + state: DataloadState.EMPTY, valueDetail: null, }, ], @@ -54,14 +77,28 @@ export const baseDataLoad: Dataload = { zone: 'utc', }), value: 12, + state: DataloadState.VALID, valueDetail: null, } +export const baseMultiFluidDataLoad: Dataload = { + date: DateTime.fromISO('2021-09-23T00:00:00.000Z', { + zone: 'utc', + }), + value: 12, + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 6, state: DataloadState.VALID }, + { value: 4, state: DataloadState.VALID }, + { value: 2, state: DataloadState.VALID }, + ], +} export const dataLoadArray: Dataload[] = [ { date: DateTime.fromISO('2021-09-23T00:00:00.000Z', { zone: 'utc', }), value: 12, + state: DataloadState.VALID, valueDetail: null, }, { @@ -69,6 +106,7 @@ export const dataLoadArray: Dataload[] = [ zone: 'utc', }), value: 12, + state: DataloadState.VALID, valueDetail: null, }, { @@ -76,6 +114,7 @@ export const dataLoadArray: Dataload[] = [ zone: 'utc', }), value: 12, + state: DataloadState.VALID, valueDetail: null, }, { @@ -83,6 +122,7 @@ export const dataLoadArray: Dataload[] = [ zone: 'utc', }), value: 12, + state: DataloadState.VALID, valueDetail: null, }, ] @@ -94,20 +134,31 @@ export const graphMonthData: Datachart = { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-01T00:00:00.000Z', { zone: 'utc', }), value: 61.65554999999999, - valueDetail: [40.21918999999999, 0.8064649999999999, 20.629894999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 40.21918999999999, state: DataloadState.VALID }, + { value: 0.8064649999999999, state: DataloadState.VALID }, + { value: 20.629894999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-11-01T00:00:00.000Z', { zone: 'utc', }), value: -1, + state: DataloadState.AGGREGATED_EMPTY, valueDetail: null, }, ], @@ -117,20 +168,31 @@ export const graphMonthData: Datachart = { zone: 'utc', }), value: 54.090509999999995, - valueDetail: [35.284358, 0.707513, 18.098639], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 35.284358, state: DataloadState.VALID }, + { value: 0.707513, state: DataloadState.VALID }, + { value: 18.098639, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-09-02T00:00:00.000Z', { zone: 'utc', }), value: 56.57427, - valueDetail: [36.904565999999996, 0.740001, 18.929703], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 36.904565999999996, state: DataloadState.VALID }, + { value: 0.740001, state: DataloadState.VALID }, + { value: 18.929703, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-09-03T00:00:00.000Z', { zone: 'utc', }), value: -1, + state: DataloadState.AGGREGATED_EMPTY, valueDetail: null, }, ], @@ -143,238 +205,408 @@ export const fullMonthGraphData: Datachart = { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-02T00:00:00.000Z', { zone: 'utc', }), value: 61.65554999999999, - valueDetail: [40.21918999999999, 0.8064649999999999, 20.629894999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 40.21918999999999, state: DataloadState.VALID }, + { value: 0.8064649999999999, state: DataloadState.VALID }, + { value: 20.629894999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-03T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-04T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-05T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-06T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-04T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-05T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-06T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-07T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-08T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-09T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-10T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-11T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-12T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-13T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-14T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-15T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-16T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-17T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-18T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-19T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-20T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-21T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-22T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-23T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-24T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-25T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-26T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-27T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-28T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-29T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-30T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-31T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, ], comparisonData: null, @@ -387,42 +619,72 @@ export const fullGraphData: Datachart = { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-02T00:00:00.000Z', { zone: 'utc', }), value: 61.65554999999999, - valueDetail: [40.21918999999999, 0.8064649999999999, 20.629894999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 40.21918999999999, state: DataloadState.VALID }, + { value: 0.8064649999999999, state: DataloadState.VALID }, + { value: 20.629894999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-03T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-04T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-05T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-10-06T00:00:00.000Z', { zone: 'utc', }), value: 69.18029999999999, - valueDetail: [45.127739999999996, 0.9048899999999999, 23.147669999999998], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 45.127739999999996, state: DataloadState.VALID }, + { value: 0.9048899999999999, state: DataloadState.VALID }, + { value: 23.147669999999998, state: DataloadState.VALID }, + ], }, ], comparisonData: [ @@ -431,20 +693,31 @@ export const fullGraphData: Datachart = { zone: 'utc', }), value: 54.090509999999995, - valueDetail: [35.284358, 0.707513, 18.098639], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 35.284358, state: DataloadState.VALID }, + { value: 0.707513, state: DataloadState.VALID }, + { value: 18.098639, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-09-02T00:00:00.000Z', { zone: 'utc', }), value: 56.57427, - valueDetail: [36.904565999999996, 0.740001, 18.929703], + state: DataloadState.AGGREGATED_VALID, + valueDetail: [ + { value: 36.904565999999996, state: DataloadState.VALID }, + { value: 0.740001, state: DataloadState.VALID }, + { value: 18.929703, state: DataloadState.VALID }, + ], }, { date: DateTime.fromISO('2020-09-03T00:00:00.000Z', { zone: 'utc', }), value: -1, + state: DataloadState.AGGREGATED_EMPTY, valueDetail: null, }, ], diff --git a/tests/__mocks__/enedisMonthlyAnalysisData.mock.ts b/tests/__mocks__/enedisMonthlyAnalysisData.mock.ts index e58cf19889ade7ac6ebc28ed9ad94a1a3e8e5564..76c474dfb3341bf1f0dda0a31dfcba588dbe0822 100644 --- a/tests/__mocks__/enedisMonthlyAnalysisData.mock.ts +++ b/tests/__mocks__/enedisMonthlyAnalysisData.mock.ts @@ -1,3 +1,4 @@ +import { DataloadState } from 'enum/dataload.enum' import { DateTime } from 'luxon' import { AggregatedEnedisMonthlyDataloads, @@ -56,6 +57,7 @@ export const mockDataLoadEnedisAnalysis: AggregatedEnedisMonthlyDataloads = { zone: 'utc', }), value: 0.35, + state: DataloadState.VALID, valueDetail: null, }, { @@ -63,6 +65,7 @@ export const mockDataLoadEnedisAnalysis: AggregatedEnedisMonthlyDataloads = { zone: 'utc', }), value: 0.34, + state: DataloadState.VALID, valueDetail: null, }, { @@ -70,6 +73,7 @@ export const mockDataLoadEnedisAnalysis: AggregatedEnedisMonthlyDataloads = { zone: 'utc', }), value: 0.33, + state: DataloadState.VALID, valueDetail: null, }, ], @@ -79,6 +83,7 @@ export const mockDataLoadEnedisAnalysis: AggregatedEnedisMonthlyDataloads = { zone: 'utc', }), value: 0.25, + state: DataloadState.VALID, valueDetail: null, }, { @@ -86,6 +91,7 @@ export const mockDataLoadEnedisAnalysis: AggregatedEnedisMonthlyDataloads = { zone: 'utc', }), value: 0.24, + state: DataloadState.VALID, valueDetail: null, }, { @@ -93,6 +99,7 @@ export const mockDataLoadEnedisAnalysis: AggregatedEnedisMonthlyDataloads = { zone: 'utc', }), value: 0.23, + state: DataloadState.VALID, valueDetail: null, }, ], diff --git a/tests/__mocks__/fluidStatusData.mock.ts b/tests/__mocks__/fluidStatusData.mock.ts index 82efc473ab71183eafc7339fa546520e08a522f5..e9495d91ad3d8e71ce43308f0098bb7512ec301b 100644 --- a/tests/__mocks__/fluidStatusData.mock.ts +++ b/tests/__mocks__/fluidStatusData.mock.ts @@ -8,6 +8,9 @@ export const fluidStatusData: FluidStatus[] = [ { fluidType: 0, status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: DateTime.fromISO('2019-09-01T00:00:00.000Z', { + zone: 'utc', + }), lastDataDate: DateTime.fromISO('2020-09-01T00:00:00.000Z', { zone: 'utc', }), @@ -30,7 +33,9 @@ export const fluidStatusData: FluidStatus[] = [ { fluidType: 1, status: FluidState.KONNECTOR_NOT_FOUND, - + firstDataDate: DateTime.fromISO('2019-09-01T00:00:00.000Z', { + zone: 'utc', + }), lastDataDate: DateTime.fromISO('2020-09-01T00:00:00.000Z', { zone: 'utc', }), @@ -53,6 +58,9 @@ export const fluidStatusData: FluidStatus[] = [ { fluidType: 2, status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: DateTime.fromISO('2019-09-01T00:00:00.000Z', { + zone: 'utc', + }), lastDataDate: DateTime.fromISO('2020-09-01T00:00:00.000Z', { zone: 'utc', }), @@ -90,6 +98,9 @@ export const fluidStatusConnectedData: FluidStatus[] = [ { fluidType: 0, status: FluidState.DONE, + firstDataDate: DateTime.fromISO('2019-09-01T00:00:00.000Z', { + zone: 'utc', + }), lastDataDate: DateTime.fromISO('2020-09-01T00:00:00.000Z', { zone: 'utc', }), @@ -112,6 +123,9 @@ export const fluidStatusConnectedData: FluidStatus[] = [ { fluidType: 1, status: FluidState.DONE, + firstDataDate: DateTime.fromISO('2019-09-01T00:00:00.000Z', { + zone: 'utc', + }), lastDataDate: DateTime.fromISO('2020-09-01T00:00:00.000Z', { zone: 'utc', }), @@ -134,6 +148,9 @@ export const fluidStatusConnectedData: FluidStatus[] = [ { fluidType: 2, status: FluidState.DONE, + firstDataDate: DateTime.fromISO('2019-09-01T00:00:00.000Z', { + zone: 'utc', + }), lastDataDate: DateTime.fromISO('2020-09-01T00:00:00.000Z', { zone: 'utc', }), diff --git a/tests/__mocks__/globalStateData.mock.ts b/tests/__mocks__/globalStateData.mock.ts index 7315927e701cbb3470a7c838e460510025297aeb..4b8de03a74274e1cd9df2f8a74c4df7e440c3210 100644 --- a/tests/__mocks__/globalStateData.mock.ts +++ b/tests/__mocks__/globalStateData.mock.ts @@ -21,6 +21,7 @@ export const globalStateData: GlobalState = { { fluidType: FluidType.ELECTRICITY, status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: null, lastDataDate: null, connection: { shouldLaunchKonnector: false, @@ -41,6 +42,7 @@ export const globalStateData: GlobalState = { { fluidType: FluidType.WATER, status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: null, lastDataDate: null, connection: { shouldLaunchKonnector: false, @@ -61,6 +63,7 @@ export const globalStateData: GlobalState = { { fluidType: FluidType.GAS, status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: null, lastDataDate: null, connection: { shouldLaunchKonnector: false, @@ -80,4 +83,5 @@ export const globalStateData: GlobalState = { }, ], fluidTypes: [], + shouldRefreshConsent: false, } diff --git a/tests/__mocks__/profile.mock.ts b/tests/__mocks__/profile.mock.ts index 57ea3c6099ffa237f363c284d2109dd395f8024d..f235a0c213b5d3552e433a20347b92d7b6358152 100644 --- a/tests/__mocks__/profile.mock.ts +++ b/tests/__mocks__/profile.mock.ts @@ -6,7 +6,6 @@ export const profileData: Profile = { _rev: '16-57473da4fc26315247c217083175dfa0', id: '4d9403218ef13e65b2e3a8ad1700bc41', ecogestureHash: '9798a0aaccb47cff906fc4931a2eff5f9371dd8b', - fluidPricesHash: '9798a0aaccb47cff906fc4931a2eff5f9371dd8a', challengeHash: '1136feb6185c7643e071d14180c0e95782aa4ba3', duelHash: '1136feb6185c7643e071d14180c0e95782aa4ba3', quizHash: '1136feb6185c7643e071d14180c0e95782aa4ba3', @@ -32,4 +31,7 @@ export const profileData: Profile = { }, haveSeenEcogestureModal: false, isProfileEcogestureCompleted: false, + activateHalfHourDate: DateTime.fromISO('2020-11-03T00:00:00.000Z', { + zone: 'utc', + }), } diff --git a/tests/__mocks__/profileType.mock.ts b/tests/__mocks__/profileType.mock.ts index 9493b055be5ba6b775c56814887155f5ebe63553..52197f89c178db115de01ef5dae64f43f7f60d36 100644 --- a/tests/__mocks__/profileType.mock.ts +++ b/tests/__mocks__/profileType.mock.ts @@ -168,7 +168,7 @@ export const mockMonthlyForecastJanuaryTestProfile1: MonthlyForecast = { }, fluidType: 0, load: 4340, - value: 676.17, + value: 755.16, }, { detailsMonthlyForecast: { @@ -196,7 +196,7 @@ export const mockMonthlyForecastJanuaryTestProfile1: MonthlyForecast = { }, ], month: 1, - totalValue: 765.774, + totalValue: 844.764, } export const mockTestProfile2: ProfileType = { @@ -233,7 +233,7 @@ export const mockMonthlyForecastJanuaryTestProfile2: MonthlyForecast = { }, fluidType: 0, load: 1670, - value: 260.19, + value: 290.58, }, { detailsMonthlyForecast: { @@ -261,7 +261,7 @@ export const mockMonthlyForecastJanuaryTestProfile2: MonthlyForecast = { }, ], month: 1, - totalValue: 287.286, + totalValue: 317.676, } export const mockTestProfile3: ProfileType = { @@ -298,7 +298,7 @@ export const mockMonthlyForecastJanuaryTestProfile3: MonthlyForecast = { }, fluidType: 0, load: 194, - value: 30.225, + value: 33.756, }, { detailsMonthlyForecast: { @@ -326,7 +326,7 @@ export const mockMonthlyForecastJanuaryTestProfile3: MonthlyForecast = { }, ], month: 1, - totalValue: 57.321, + totalValue: 60.852000000000004, } export const mockProfileTypeAnswers: ProfileTypeAnswer[] = [ @@ -434,7 +434,7 @@ export const mockMonthlyForecastJanuaryTest1WithFullArrays: MonthlyForecast = { }, fluidType: 0, load: 2745, - value: 427.67, + value: 477.63, }, { detailsMonthlyForecast: { @@ -462,5 +462,5 @@ export const mockMonthlyForecastJanuaryTest1WithFullArrays: MonthlyForecast = { }, ], month: 1, - totalValue: 517.274, + totalValue: 567.234, } diff --git a/tests/__mocks__/store.ts b/tests/__mocks__/store.ts index 38527720544dd537c7c879b6229fc93dff018f70..74f61acc8ef2376b703c69b199126a9d3eee09be 100644 --- a/tests/__mocks__/store.ts +++ b/tests/__mocks__/store.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/camelcase */ + import { FluidState, FluidType } from 'enum/fluid.enum' import { ConstructionYear, @@ -16,6 +18,7 @@ import { DateTime } from 'luxon' import { ChallengeState, ChartState, + FluidStatus, GlobalState, ModalState, Profile, @@ -42,6 +45,7 @@ export const mockInitialGlobalState: GlobalState = { { fluidType: FluidType.ELECTRICITY, status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: null, lastDataDate: null, connection: { shouldLaunchKonnector: false, @@ -62,6 +66,7 @@ export const mockInitialGlobalState: GlobalState = { { fluidType: FluidType.WATER, status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: null, lastDataDate: null, connection: { shouldLaunchKonnector: false, @@ -82,6 +87,7 @@ export const mockInitialGlobalState: GlobalState = { { fluidType: FluidType.GAS, status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: null, lastDataDate: null, connection: { shouldLaunchKonnector: false, @@ -101,6 +107,36 @@ export const mockInitialGlobalState: GlobalState = { }, ], fluidTypes: [], + shouldRefreshConsent: false, +} +export const mockExpiredElec: FluidStatus = { + fluidType: FluidType.ELECTRICITY, + status: FluidState.KONNECTOR_NOT_FOUND, + firstDataDate: null, + lastDataDate: null, + connection: { + shouldLaunchKonnector: false, + isUpdating: false, + konnector: null, + account: null, + trigger: null, + triggerState: { + trigger_id: '0', + status: '', + last_executed_job_id: '', + last_execution: '', + last_manual_execution: '', + last_manual_job_id: '', + last_error: 'USER_ACTION_NEEDED.OAUTH_OUTDATED', + }, + konnectorConfig: { + name: '', + oauth: false, + slug: '', + siteLink: '', + activation: '', + }, + }, } export const mockInitialProfileState: Profile = { @@ -125,6 +161,7 @@ export const mockInitialProfileState: Profile = { isWelcomeSeen: false, }, haveSeenEcogestureModal: false, + activateHalfHourDate: DateTime.fromISO('0000-01-01T00:00:00.000Z'), } export const mockInitialProfileTypeState: ProfileType = { diff --git a/tests/__mocks__/triggersData.mock.ts b/tests/__mocks__/triggersData.mock.ts index 698c303a838d90d0063187419eb9c1f72e428739..c10a77c9b8073519e8f8c9ca5ec200c810204785 100644 --- a/tests/__mocks__/triggersData.mock.ts +++ b/tests/__mocks__/triggersData.mock.ts @@ -65,3 +65,69 @@ export const triggersData: Trigger[] = [ }, }, ] + +export const triggersEnedisData: Trigger[] = [ + { + _id: '3ed832cec67e6e0b2c6382edd30df11c', + domain: 'cozy.tools:8080', + prefix: 'cozy35ba44d2d1749e6f21646edce51e7190', + type: '@cron', + worker: 'konnector', + arguments: '0 47 8 * * *', + debounce: '', + options: null, + message: { + account: '88e68b8450cee09fe2f077610901094d', + konnector: 'enedisgrandlyon', + }, + cozyMetadata: { + doctypeVersion: '1', + metadataVersion: 1, + createdAt: '2020-10-01T08:00:00.6092798Z', + createdByApp: 'ecolyo', + updatedAt: '2020-10-09T08:00:00.6092798Z', + }, + }, + { + _id: '5ed832cec67e6e0b2c6382edd30df11c', + domain: 'cozy.tools:8080', + prefix: 'cozy35ba44d2d1749e6f21646edce51e7190', + type: '@cron', + worker: 'konnector', + arguments: '0 47 8 * * *', + debounce: '', + options: null, + message: { + account: '90e68b8450cee09fe2f077610901094d', + konnector: 'enedisgrandlyon', + }, + cozyMetadata: { + doctypeVersion: '1', + metadataVersion: 1, + createdAt: '2020-10-09T08:00:00.6092798Z', + createdByApp: 'ecolyo', + updatedAt: '2020-10-09T08:00:00.6092798Z', + }, + }, + { + _id: '4ed832cec67e6e0b2c6382edd30df11c', + domain: 'cozy.tools:8080', + prefix: 'cozy35ba44d2d1749e6f21646edce51e7190', + type: '@cron', + worker: 'konnector', + arguments: '0 47 8 * * *', + debounce: '', + options: null, + message: { + account: '89e68b8450cee09fe2f077610901094d', + konnector: 'enedisgrandlyon', + }, + cozyMetadata: { + doctypeVersion: '1', + metadataVersion: 1, + createdAt: '2020-10-09T08:00:00.6092798Z', + createdByApp: 'ecolyo', + updatedAt: '2020-10-09T08:00:00.6092798Z', + }, + }, +]