From 686ff6351c96758ac5c373ac3d831da99e000af3 Mon Sep 17 00:00:00 2001
From: Yoan VALLET <ext.sopra.yvallet@grandlyon.com>
Date: Tue, 30 Mar 2021 14:17:48 +0200
Subject: [PATCH] feat: update konnector labels and aria-labels

---
 .../Connection/ConnectionFormLogin.tsx        |   6 +-
 .../Connection/ConnectionNotFound.tsx         |  82 +++--
 .../Connection/ConnectionResult.tsx           | 302 +++++++++---------
 src/components/Header/Header.tsx              |  18 +-
 src/components/Konnector/KonnectorModal.tsx   |  26 +-
 .../Konnector/KonnectorViewerCard.tsx         |  31 +-
 .../Konnector/KonnectorViewerList.tsx         |  84 ++---
 src/enum/konnectorUpdate.enum.ts              |   8 +-
 src/locales/fr.json                           |  83 +++--
 9 files changed, 338 insertions(+), 302 deletions(-)

diff --git a/src/components/Connection/ConnectionFormLogin.tsx b/src/components/Connection/ConnectionFormLogin.tsx
index 33ea3752a..5f1116848 100644
--- a/src/components/Connection/ConnectionFormLogin.tsx
+++ b/src/components/Connection/ConnectionFormLogin.tsx
@@ -82,7 +82,7 @@ const ConnectionFormLogin: React.FC<ConnectionFormLoginProps> = ({
         trigger: _trigger,
       } = await connectionService.connectNewUser(konnectorSlug, login, password)
       if (!_trigger) {
-        setError(t('KONNECTORCONFIG.ERROR_ACCOUNT_CREATION'))
+        setError(t('konnector_form.error_account_creation'))
         return null
       }
       const updatedConnection: FluidConnection = {
@@ -124,7 +124,7 @@ const ConnectionFormLogin: React.FC<ConnectionFormLoginProps> = ({
       setError('')
       setLoading(true)
       if (!login || !password) {
-        setError(t('KONNECTORCONFIG.ERROR_NO_LOGIN_PASSWORD'))
+        setError(t('konnector_form.error_no_login_password'))
         setLoading(false)
         return null
       }
@@ -145,7 +145,7 @@ const ConnectionFormLogin: React.FC<ConnectionFormLoginProps> = ({
       if (authData.login) {
         setLogin(authData.login)
       }
-      setError(t('KONNECTORCONFIG.ERROR_LOGIN_FAILED'))
+      setError(t('konnector_form.error_login_failed'))
     }
   }, [account, t])
 
diff --git a/src/components/Connection/ConnectionNotFound.tsx b/src/components/Connection/ConnectionNotFound.tsx
index 1019d1dad..9eee50aa1 100644
--- a/src/components/Connection/ConnectionNotFound.tsx
+++ b/src/components/Connection/ConnectionNotFound.tsx
@@ -1,42 +1,40 @@
-import React from 'react'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import MuiButton from '@material-ui/core/Button'
-import './connectionNotFound.scss'
-interface ConnectionNotFoundProps {
-  konnectorSlug: string
-}
-
-const ConnectionNotFound: React.FC<ConnectionNotFoundProps> = ({
-  konnectorSlug,
-}: ConnectionNotFoundProps) => {
-  const { t } = useI18n()
-
-  const openKonnectorURL = () => {
-    // TODO - Use getstoreinstallationurl from client - https://docs.cozy.io/en/cozy-client/api/cozy-client/#getstoreinstallationurl-string
-    const hostname = window.location.origin.replace('ecolyo', 'store')
-    const url = hostname + '/#/discover/' + konnectorSlug
-    window.open(url, '_blank')
-  }
-
-  return (
-    <div className="knotfound">
-      <div className="knotfound-text">
-        {' '}
-        {t('KONNECTORCONFIG.NOT_INSTALLED')}
-      </div>
-      <div className="knotfound-button">
-        <MuiButton
-          onClick={openKonnectorURL}
-          classes={{
-            root: 'btn-highlight',
-            label: 'text-16-bold',
-          }}
-        >
-          {t('KONNECTORCONFIG.BTN_INSTALL')}
-        </MuiButton>
-      </div>
-    </div>
-  )
-}
-
-export default ConnectionNotFound
+import React from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import Button from '@material-ui/core/Button'
+import './connectionNotFound.scss'
+interface ConnectionNotFoundProps {
+  konnectorSlug: string
+}
+
+const ConnectionNotFound: React.FC<ConnectionNotFoundProps> = ({
+  konnectorSlug,
+}: ConnectionNotFoundProps) => {
+  const { t } = useI18n()
+
+  const openKonnectorURL = () => {
+    // TODO - Use getstoreinstallationurl from client - https://docs.cozy.io/en/cozy-client/api/cozy-client/#getstoreinstallationurl-string
+    const hostname = window.location.origin.replace('ecolyo', 'store')
+    const url = hostname + '/#/discover/' + konnectorSlug
+    window.open(url, '_blank')
+  }
+
+  return (
+    <div className="knotfound">
+      <div className="knotfound-text"> {t('konnector_form.not_installed')}</div>
+      <div className="knotfound-button">
+        <Button
+          aria-label={t('konnector_form.accessibility.button_install')}
+          onClick={openKonnectorURL}
+          classes={{
+            root: 'btn-highlight',
+            label: 'text-16-bold',
+          }}
+        >
+          {t('konnector_form.button_install')}
+        </Button>
+      </div>
+    </div>
+  )
+}
+
+export default ConnectionNotFound
diff --git a/src/components/Connection/ConnectionResult.tsx b/src/components/Connection/ConnectionResult.tsx
index c24126040..fdab666cb 100644
--- a/src/components/Connection/ConnectionResult.tsx
+++ b/src/components/Connection/ConnectionResult.tsx
@@ -1,150 +1,152 @@
-import React, { useState, useEffect } 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 { Account, FluidConnection, FluidStatus } from 'models'
-import AccountService from 'services/account.service'
-import { getKonnectorUpdateError } from 'utils/utils'
-
-import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import warningWhite from 'assets/icons/ico/warning-white.svg'
-import MuiButton from '@material-ui/core/Button'
-import StyledBlackSpinner from 'components/CommonKit/Spinner/StyledBlackSpinner'
-
-import './connectionResult.scss'
-
-interface ConnectionResultProps {
-  fluidStatus: FluidStatus
-  handleAccountDeletion: Function
-}
-
-const ConnectionResult: React.FC<ConnectionResultProps> = ({
-  fluidStatus,
-  handleAccountDeletion,
-}: ConnectionResultProps) => {
-  const { t } = useI18n()
-  const client = useClient()
-  const dispatch = useDispatch()
-  const account: Account | null = fluidStatus.connection.account
-
-  const [updating, setUpdating] = useState<boolean>(false)
-  const [lastExecutionDate, setLastExecutionDate] = useState<string>('-')
-  const [konnectorError, setKonnectorError] = useState<string>('')
-  const [status, setStatus] = useState<string>('')
-
-  const updateKonnector = async () => {
-    setUpdating(true)
-    setStatus('')
-    setLastExecutionDate('-')
-    setKonnectorError('')
-    const updatedConnection: FluidConnection = {
-      ...fluidStatus.connection,
-      shouldLaunchKonnector: true,
-      isUpdating: true,
-    }
-    dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection))
-    setUpdating(false)
-  }
-
-  const deleteAccount = async () => {
-    setUpdating(true)
-    try {
-      if (account) {
-        const accountService = new AccountService(client)
-        await accountService.deleteAccount(account)
-        await handleAccountDeletion()
-      }
-    } catch (error) {
-      setUpdating(false)
-    }
-  }
-
-  useEffect(() => {
-    if (
-      fluidStatus.connection.triggerState &&
-      fluidStatus.connection.triggerState.last_success
-    ) {
-      setLastExecutionDate(
-        new Date(
-          fluidStatus.connection.triggerState.last_success
-        ).toLocaleString()
-      )
-    } else {
-      setLastExecutionDate('-')
-    }
-    if (
-      fluidStatus.connection.triggerState &&
-      fluidStatus.connection.triggerState.status === 'errored' &&
-      fluidStatus.connection.triggerState.last_error
-    ) {
-      setKonnectorError(
-        getKonnectorUpdateError(fluidStatus.connection.triggerState.last_error)
-      )
-    }
-  }, [fluidStatus.connection.triggerState])
-
-  return (
-    <div className="accordion-update-result">
-      <div
-        className={
-          status === 'errored' ? 'accordion-update-errored' : 'accordion-update'
-        }
-      >
-        {status === 'errored' && (
-          <div className="accordion-caption-errored warning-white text-16-normal">
-            <StyledIcon
-              icon={warningWhite}
-              size={36}
-              className="warning-icon"
-            />
-            <div className="text-16-normal">
-              {t(`KONNECTORCONFIG.${konnectorError}`)}
-              <div className="accordion-caption">
-                {t('KONNECTORCONFIG.LABEL_UPDATEDAT')}
-              </div>
-              <div className="text-16-bold">{lastExecutionDate}</div>
-            </div>
-          </div>
-        )}
-        {status !== 'errored' && (
-          <div>
-            <div className="accordion-caption text-16-normal">
-              {t('KONNECTORCONFIG.LABEL_UPDATEDAT')}
-            </div>
-            <div className="text-16-bold">{lastExecutionDate}</div>
-          </div>
-        )}
-      </div>
-      <div className="inline-buttons">
-        <MuiButton
-          onClick={deleteAccount}
-          disabled={updating}
-          classes={{
-            root: 'btn-secondary-positive',
-            label: 'text-16-normal',
-          }}
-        >
-          {t('KONNECTORCONFIG.BTN_DELETE')}
-        </MuiButton>
-        <MuiButton
-          onClick={updateKonnector}
-          disabled={updating}
-          classes={{
-            root: 'btn-highlight',
-            label: 'text-16-bold',
-          }}
-        >
-          {updating ? (
-            <StyledBlackSpinner size="2em" />
-          ) : (
-            <div>{t('KONNECTORCONFIG.BTN_UPDATE')}</div>
-          )}
-        </MuiButton>
-      </div>
-    </div>
-  )
-}
-
-export default ConnectionResult
+import React, { useState, useEffect } 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 { Account, FluidConnection, FluidStatus } from 'models'
+import AccountService from 'services/account.service'
+import { getKonnectorUpdateError } from 'utils/utils'
+
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import warningWhite from 'assets/icons/ico/warning-white.svg'
+import Button from '@material-ui/core/Button'
+import StyledBlackSpinner from 'components/CommonKit/Spinner/StyledBlackSpinner'
+
+import './connectionResult.scss'
+
+interface ConnectionResultProps {
+  fluidStatus: FluidStatus
+  handleAccountDeletion: Function
+}
+
+const ConnectionResult: React.FC<ConnectionResultProps> = ({
+  fluidStatus,
+  handleAccountDeletion,
+}: ConnectionResultProps) => {
+  const { t } = useI18n()
+  const client = useClient()
+  const dispatch = useDispatch()
+  const account: Account | null = fluidStatus.connection.account
+
+  const [updating, setUpdating] = useState<boolean>(false)
+  const [lastExecutionDate, setLastExecutionDate] = useState<string>('-')
+  const [konnectorError, setKonnectorError] = useState<string>('')
+  const [status, setStatus] = useState<string>('')
+
+  const updateKonnector = async () => {
+    setUpdating(true)
+    setStatus('')
+    setLastExecutionDate('-')
+    setKonnectorError('')
+    const updatedConnection: FluidConnection = {
+      ...fluidStatus.connection,
+      shouldLaunchKonnector: true,
+      isUpdating: true,
+    }
+    dispatch(updatedFluidConnection(fluidStatus.fluidType, updatedConnection))
+    setUpdating(false)
+  }
+
+  const deleteAccount = async () => {
+    setUpdating(true)
+    try {
+      if (account) {
+        const accountService = new AccountService(client)
+        await accountService.deleteAccount(account)
+        await handleAccountDeletion()
+      }
+    } catch (error) {
+      setUpdating(false)
+    }
+  }
+
+  useEffect(() => {
+    if (
+      fluidStatus.connection.triggerState &&
+      fluidStatus.connection.triggerState.last_success
+    ) {
+      setLastExecutionDate(
+        new Date(
+          fluidStatus.connection.triggerState.last_success
+        ).toLocaleString()
+      )
+    } else {
+      setLastExecutionDate('-')
+    }
+    if (
+      fluidStatus.connection.triggerState &&
+      fluidStatus.connection.triggerState.status === 'errored' &&
+      fluidStatus.connection.triggerState.last_error
+    ) {
+      setKonnectorError(
+        getKonnectorUpdateError(fluidStatus.connection.triggerState.last_error)
+      )
+    }
+  }, [fluidStatus.connection.triggerState])
+
+  return (
+    <div className="accordion-update-result">
+      <div
+        className={
+          status === 'errored' ? 'accordion-update-errored' : 'accordion-update'
+        }
+      >
+        {status === 'errored' && (
+          <div className="accordion-caption-errored warning-white text-16-normal">
+            <StyledIcon
+              icon={warningWhite}
+              size={36}
+              className="warning-icon"
+            />
+            <div className="text-16-normal">
+              {t(`konnector_form.${konnectorError}`)}
+              <div className="accordion-caption">
+                {t('konnector_form.label_updated_at')}
+              </div>
+              <div className="text-16-bold">{lastExecutionDate}</div>
+            </div>
+          </div>
+        )}
+        {status !== 'errored' && (
+          <div>
+            <div className="accordion-caption text-16-normal">
+              {t('konnector_form.label_updated_at')}
+            </div>
+            <div className="text-16-bold">{lastExecutionDate}</div>
+          </div>
+        )}
+      </div>
+      <div className="inline-buttons">
+        <Button
+          aria-label={t('konnector_form.accessibility.button_delete')}
+          onClick={deleteAccount}
+          disabled={updating}
+          classes={{
+            root: 'btn-secondary-positive',
+            label: 'text-16-normal',
+          }}
+        >
+          {t('konnector_form.button_delete')}
+        </Button>
+        <Button
+          aria-label={t('konnector_form.accessibility.button_update')}
+          onClick={updateKonnector}
+          disabled={updating}
+          classes={{
+            root: 'btn-highlight',
+            label: 'text-16-bold',
+          }}
+        >
+          {updating ? (
+            <StyledBlackSpinner size="2em" />
+          ) : (
+            <div>{t('konnector_form.button_update')}</div>
+          )}
+        </Button>
+      </div>
+    </div>
+  )
+}
+
+export default ConnectionResult
diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx
index ed0434e2c..038b01789 100644
--- a/src/components/Header/Header.tsx
+++ b/src/components/Header/Header.tsx
@@ -7,9 +7,10 @@ import { useHistory } from 'react-router-dom'
 
 import { ScreenType } from 'enum/screen.enum'
 
+import IconButton from '@material-ui/core/IconButton'
+import Icon from 'cozy-ui/transpiled/react/Icon'
 import BackArrowIcon from 'assets/icons/ico/back-arrow.svg'
 import FeedbacksIcon from 'assets/icons/ico/feedbacks.svg'
-import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 
 interface HeaderProps {
   textKey?: string
@@ -88,27 +89,28 @@ const Header: React.FC<HeaderProps> = ({
                 }`}
               >
                 {displayBackArrow && (
-                  <StyledIconButton
+                  <IconButton
                     aria-label={t('header.accessibility.button_back')}
                     className="header-back-button"
-                    icon={BackArrowIcon}
                     onClick={handleClickBack}
-                  />
+                  >
+                    <Icon icon={BackArrowIcon} size={16} />
+                  </IconButton>
                 )}
                 {t(desktopTitleKey)}
               </div>
             )}
-            <StyledIconButton
+            <IconButton
               aria-label={t('header.accessibility.button_open_feedbacks')}
               className={
                 !textKey && !desktopTitleKey
                   ? 'header-feedbacks-button right'
                   : 'header-feedbacks-button'
               }
-              icon={FeedbacksIcon}
-              size={40}
               onClick={handleClickFeedbacks}
-            />
+            >
+              <Icon icon={FeedbacksIcon} size={40} />
+            </IconButton>
           </div>
           {children}
         </div>
diff --git a/src/components/Konnector/KonnectorModal.tsx b/src/components/Konnector/KonnectorModal.tsx
index 8a93ab49f..999c156aa 100644
--- a/src/components/Konnector/KonnectorModal.tsx
+++ b/src/components/Konnector/KonnectorModal.tsx
@@ -61,7 +61,7 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({
       disableBackdropClick
       disableEscapeKeyDown
       onClose={handleCloseClick}
-      aria-label={t('KONNECTORCONFIG.accessibility.window_title')}
+      aria-label={t('konnector_modal.accessibility.window_title')}
       classes={{
         root: 'modal-root',
         paper: 'modal-paper',
@@ -74,7 +74,7 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({
             <div className="kmodal-content-text kmodal-content-text-center text-16-normal">
               <div className="kc-wait text-16-bold">
                 {t(
-                  `KONNECTORCONFIG.LOADING_DATA${isUpdating ? '_UPDATE' : ''}`
+                  `konnector_modal.loading_data${isUpdating ? '_update' : ''}`
                 )}
               </div>
             </div>
@@ -116,39 +116,39 @@ const KonnectorModal: React.FC<KonnectorModalProps> = ({
                 <div className="konnector-config">
                   <Icon icon={errorIcon} size={48} />
                   <div className="kce-picto-txt text-20-bold">
-                    {t('KONNECTORCONFIG.ERROR_TXT')}
+                    {t('konnector_modal.error_txt')}
                   </div>
                   <div>
                     {t(
-                      `KONNECTORCONFIG.ERROR_DATA_${
-                        isUpdating ? 'UPDATE_' : ''
-                      }${fluidName}`
+                      `konnector_modal.error_data_${
+                        isUpdating ? 'update_' : ''
+                      }${fluidName.toLowerCase()}`
                     )}
                   </div>
-                  <div>{t('KONNECTORCONFIG.ERROR_DATA_2')}</div>
+                  <div>{t('konnector_modal.error_data_2')}</div>
                 </div>
               ) : (
                 <div className="konnector-config">
                   <Icon icon={successIcon} size={48} />
                   <div className="kcs-picto-txt text-20-bold">
-                    {t('KONNECTORCONFIG.SUCCESS_TXT')}
+                    {t('konnector_modal.success_txt')}
                   </div>
                   {t(
-                    `KONNECTORCONFIG.SUCCESS_DATA_${
-                      isUpdating ? 'UPDATE_' : ''
-                    }${fluidName}`
+                    `konnector_modal.success_data_${
+                      isUpdating ? 'update_' : ''
+                    }${fluidName.toLowerCase()}`
                   )}
                 </div>
               )}
               <Button
-                aria-label={t('KONNECTORCONFIG.accessibility.button_close')}
+                aria-label={t('konnector_modal.accessibility.button_close')}
                 onClick={() => handleCloseClick()}
                 classes={{
                   root: 'btn-highlight',
                   label: 'text-16-bold',
                 }}
               >
-                <div>{t('KONNECTORCONFIG.OK')}</div>
+                <div>{t('konnector_modal.button_validate')}</div>
               </Button>
             </div>
           </>
diff --git a/src/components/Konnector/KonnectorViewerCard.tsx b/src/components/Konnector/KonnectorViewerCard.tsx
index 857b96308..9020e296f 100644
--- a/src/components/Konnector/KonnectorViewerCard.tsx
+++ b/src/components/Konnector/KonnectorViewerCard.tsx
@@ -30,8 +30,8 @@ import ChallengeService from 'services/challenge.service'
 
 import chevronDown from 'assets/icons/ico/chevron-down.svg'
 import chevronUp from 'assets/icons/ico/chevron-up.svg'
-import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import Icon from 'cozy-ui/transpiled/react/Icon'
+import IconButton from '@material-ui/core/IconButton'
 import failurePicto from 'assets/png/picto/picto-failure.png'
 import ConnectionNotFound from 'components/Connection/ConnectionNotFound'
 import ConnectionForm from 'components/Connection/ConnectionForm'
@@ -272,9 +272,9 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
             <div className="accordion-icon">
               {fluidStatus.connection.account &&
               fluidStatus.status !== FluidState.ERROR_LOGIN_FAILED ? (
-                <StyledIcon className="icon" icon={iconType} size={49} />
+                <Icon className="icon" icon={iconType} size={49} />
               ) : (
-                <StyledIcon className="icon" icon={iconAddType} size={49} />
+                <Icon className="icon" icon={iconAddType} size={49} />
               )}
             </div>
             <div className="state-picto">
@@ -295,12 +295,29 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
                 fluidStatus.status !== FluidState.ERROR_LOGIN_FAILED
                   ? t('FLUID.' + FluidType[fluidStatus.fluidType] + '.LABEL')
                   : t(
-                      'KONNECTORCONFIG.LABEL_CONNECTTO_' +
-                        FluidType[fluidStatus.fluidType]
+                      `konnector_options.label_connect_to_${FluidType[
+                        fluidStatus.fluidType
+                      ].toLowerCase()}`
                     )}
               </div>
             </div>
-            <StyledIconButton icon={active ? chevronUp : chevronDown} />
+            <IconButton
+              aria-label={
+                active
+                  ? t(
+                      `konnector_options.accessibility.button_hide_detail_${FluidType[
+                        fluidStatus.fluidType
+                      ].toLowerCase()}`
+                    )
+                  : t(
+                      `konnector_options.accessibility.button_show_detail_${FluidType[
+                        fluidStatus.fluidType
+                      ].toLowerCase()}`
+                    )
+              }
+            >
+              <Icon icon={active ? chevronUp : chevronDown} size={16} />
+            </IconButton>
           </div>
 
           <div
diff --git a/src/components/Konnector/KonnectorViewerList.tsx b/src/components/Konnector/KonnectorViewerList.tsx
index bbb298916..e6027b64a 100644
--- a/src/components/Konnector/KonnectorViewerList.tsx
+++ b/src/components/Konnector/KonnectorViewerList.tsx
@@ -1,42 +1,42 @@
-import React from 'react'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import { useSelector } from 'react-redux'
-import { AppStore } from 'store'
-import './konnectorViewerList.scss'
-
-import { FluidStatus } from 'models'
-import KonnectorViewerCard from 'components/Konnector/KonnectorViewerCard'
-
-interface KonnectorViewerListProps {
-  isParam: boolean
-}
-
-const KonnectorViewerList: React.FC<KonnectorViewerListProps> = ({
-  isParam = false,
-}: KonnectorViewerListProps) => {
-  const { t } = useI18n()
-  const { fluidStatus } = useSelector((state: AppStore) => state.ecolyo.global)
-
-  return (
-    <div className="kv-root">
-      <div className="kv-content">
-        <div className="kv-header text-16-normal-uppercase">
-          {t('KONNECTORCONFIG.TITLE_CONNECTION')}
-        </div>
-        <div className="accordion-container">
-          {fluidStatus.map((fluidStatusItem: FluidStatus, index: number) => {
-            return (
-              <KonnectorViewerCard
-                key={index}
-                isParam={isParam}
-                fluidStatus={fluidStatusItem}
-              />
-            )
-          })}
-        </div>
-      </div>
-    </div>
-  )
-}
-
-export default KonnectorViewerList
+import React from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useSelector } from 'react-redux'
+import { AppStore } from 'store'
+import './konnectorViewerList.scss'
+
+import { FluidStatus } from 'models'
+import KonnectorViewerCard from 'components/Konnector/KonnectorViewerCard'
+
+interface KonnectorViewerListProps {
+  isParam: boolean
+}
+
+const KonnectorViewerList: React.FC<KonnectorViewerListProps> = ({
+  isParam = false,
+}: KonnectorViewerListProps) => {
+  const { t } = useI18n()
+  const { fluidStatus } = useSelector((state: AppStore) => state.ecolyo.global)
+
+  return (
+    <div className="kv-root">
+      <div className="kv-content">
+        <div className="kv-header text-16-normal-uppercase">
+          {t('konnector_form.title')}
+        </div>
+        <div className="accordion-container">
+          {fluidStatus.map((fluidStatusItem: FluidStatus, index: number) => {
+            return (
+              <KonnectorViewerCard
+                key={index}
+                isParam={isParam}
+                fluidStatus={fluidStatusItem}
+              />
+            )
+          })}
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default KonnectorViewerList
diff --git a/src/enum/konnectorUpdate.enum.ts b/src/enum/konnectorUpdate.enum.ts
index 1a1fd1b67..5923efb32 100644
--- a/src/enum/konnectorUpdate.enum.ts
+++ b/src/enum/konnectorUpdate.enum.ts
@@ -1,4 +1,4 @@
-export enum KonnectorUpdate {
-  ERROR_UPDATE = 'ERROR_UPDATE',
-  ERROR_UPDATE_OAUTH = 'ERROR_UPDATE_OAUTH',
-}
+export enum KonnectorUpdate {
+  ERROR_UPDATE = 'error_update',
+  ERROR_UPDATE_OAUTH = 'error_update_oauth',
+}
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 5f5dbd9c1..e5a5a8e7c 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -124,40 +124,57 @@
       "SWITCH_LABEL": "Être prévenu de la parution de mon bilan mensuel"
     }
   },
-  "KONNECTORCONFIG": {
-    "TITLE_CONNECTION": "Connexion aux distributeurs",
-    "LABEL_UPDATEDAT": "dernière mise-à-jour le",
-    "LABEL_CONNECTTO_ELECTRICITY": "Se connecter à l'électricité",
-    "LABEL_CONNECTTO_WATER": "Se connecter à l'eau",
-    "LABEL_CONNECTTO_GAS": "Se connecter au gaz",
-    "BTN_INSTALL": "Installer",
-    "BTN_CONFIGURE": "Configurer",
-    "BTN_UPDATE": "Mettre à jour",
-    "BTN_DELETE": "Supprimer",
-    "LOADING_DATA": "Veuillez patienter, vos données sont en cours de chargement.",
-    "LOADING_DATA_UPDATE": "Veuillez patienter, vos données sont en cours de mise à jour.",
-    "NOT_INSTALLED": "Le connecteur n'est pas installé. Veuillez l'installer en cliquant sur le bouton ci-dessous.",
-    "ERROR_NO_LOGIN_PASSWORD": "Identifiant et mot de passe requis",
-    "ERROR_ACCOUNT_CREATION": "Une erreur est survenue, veuillez essayer de nouveau.",
-    "ERROR_LOGIN_FAILED": "Identifiants invalides",
-    "SUCCESS_TXT": "Félicitations !",
-    "SUCCESS_DATA_ELECTRICITY": "Vos données de consommation d'électricité sont maintenant connectées à Ecolyo.",
-    "SUCCESS_DATA_WATER": "Vos données de consommation d'eau sont maintenant connectées à Ecolyo.",
-    "SUCCESS_DATA_GAS": "Vos données de consommation de gaz sont maintenant connectées à Ecolyo.",
-    "SUCCESS_DATA_UPDATE_ELECTRICITY": "Vos données de consommation d'électricité sont maintenant à jour dans Ecolyo.",
-    "SUCCESS_DATA_UPDATE_WATER": "Vos données de consommation d'eau sont maintenant à jour dans Ecolyo.",
-    "SUCCESS_DATA_UPDATE_GAS": "Vos données de consommation de gaz sont maintenant à jour dans Ecolyo.",
-    "ERROR_TXT": "Aïe !",
-    "ERROR_DATA_ELECTRICITY": "Un problème a empêché vos données de consommation d'électricité de se connecter à Ecolyo.",
-    "ERROR_DATA_WATER": "Un problème a empêché vos données de consommation d'eau de se connecter à Ecolyo.",
-    "ERROR_DATA_GAS": "Un problème a empêché vos données de consommation de gaz de se connecter à Ecolyo.",
-    "ERROR_DATA_UPDATE_ELECTRICITY": "Un problème a empêché vos données de consommation d'électricité de se mettre à jour dans Ecolyo.",
-    "ERROR_DATA_UPDATE_WATER": "Un problème a empêché vos données de consommation d'eau de se mettre à jour dans Ecolyo.",
-    "ERROR_DATA_UPDATE_GAS": "Un problème a empêché vos données de consommation de gaz de se mettre à jour dans Ecolyo.",
-    "ERROR_DATA_2": "Merci de réessayer plus tard.",
-    "ERROR_UPDATE": "Un problème est survenu lors du rappatriement 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.",
+  "konnector_form": {
+    "title": "Connexion aux distributeurs",
+    "label_updated_at": "dernière mise-à-jour le",
+    "button_update": "Mettre à jour",
+    "button_delete": "Supprimer",
+    "not_installed": "Le connecteur n'est pas installé. Veuillez l'installer en cliquant sur le bouton ci-dessous.",
+    "button_install": "Installer",
+    "error_account_creation": "Une erreur est survenue, veuillez essayer de nouveau.",
+    "error_no_login_password": "Identifiant et mot de passe requis",
+    "error_login_failed": "Identifiants invalides",
+    "error_update": "Un problème est survenu lors du rappatriement 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.",
     "OK": "Ok",
+    "accessibility": {
+      "button_install": "Installer le connecteur",
+      "button_update": "Mettre à jour la connexion",
+      "button_delete": "Supprimer la connexion"
+    }
+  },
+  "konnector_options": {
+    "label_connect_to_electricity": "Se connecter à l'électricité",
+    "label_connect_to_water": "Se connecter à l'eau",
+    "label_connect_to_gas": "Se connecter au gaz",
+    "accessibility": {
+      "button_show_detail_electricity": "Afficher le détail de la connexion a l'électricité",
+      "button_show_detail_water": "Afficher le détail de la connexion à l'eau",
+      "button_show_detail_gas": "Afficher le détail de la connexion au gaz",
+      "button_hide_detail_electricity": "Afficher le détail de la connexion a l'électricité",
+      "button_hide_detail_water": "Afficher le détail de la connexion à l'eau",
+      "button_hide_detail_gas": "Afficher le détail de la connexion au gaz"
+    }
+  },
+  "konnector_modal": {
+    "loading_data": "Veuillez patienter, vos données sont en cours de chargement.",
+    "loading_data_update": "Veuillez patienter, vos données sont en cours de mise à jour.",
+    "success_txt": "Félicitations !",
+    "success_data_electricity": "Vos données de consommation d'électricité sont maintenant connectées à Ecolyo.",
+    "success_data_water": "Vos données de consommation d'eau sont maintenant connectées à Ecolyo.",
+    "success_data_gas": "Vos données de consommation de gaz sont maintenant connectées à Ecolyo.",
+    "success_data_update_electricity": "Vos données de consommation d'électricité sont maintenant à jour dans Ecolyo.",
+    "success_data_update_water": "Vos données de consommation d'eau sont maintenant à jour dans Ecolyo.",
+    "success_data_update_gas": "Vos données de consommation de gaz sont maintenant à jour dans Ecolyo.",
+    "error_txt": "Aïe !",
+    "error_data_electricity": "Un problème a empêché vos données de consommation d'électricité de se connecter à Ecolyo.",
+    "error_data_water": "Un problème a empêché vos données de consommation d'eau de se connecter à Ecolyo.",
+    "error_data_gas": "Un problème a empêché vos données de consommation de gaz de se connecter à Ecolyo.",
+    "error_data_update_electricity": "Un problème a empêché vos données de consommation d'électricité de se mettre à jour dans Ecolyo.",
+    "error_data_update_water": "Un problème a empêché vos données de consommation d'eau de se mettre à jour dans Ecolyo.",
+    "error_data_update_gas": "Un problème a empêché vos données de consommation de gaz de se mettre à jour dans Ecolyo.",
+    "error_data_2": "Merci de réessayer plus tard.",
+    "button_validate": "Ok",
     "accessibility": {
       "window_title": "Fenètre d'attente de connexion",
       "button_close": "Fermer la fenètre"
-- 
GitLab