diff --git a/docker-compose.yml b/docker-compose.yml index 31cbcaa2be47dc25b1e896437885b36653375f86..cebbbbb7a65d2cfdeb796490cb65c8cfb939945a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,17 +1,14 @@ version: '3.7' services: - app: - image: registry.forge.grandlyon.com/web-et-numerique/llle_project/ecolyo:latest - hostname: app - restart: 'no' - stack: - image: registry.forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/cozy-env:latest + image: cozy/cozy-app-dev:1.5.4 ports: - 8080:8080 - 5984:5984 - 8025:8025 volumes: + - ./docker/cozy-app-dev-with-app.sh:/usr/bin/cozy-app-dev.sh - ./build:/data/cozy-app/ecolyo - - ./data:/usr/local/couchdb/data + - ./data/db:/usr/local/couchdb/data + - ./data/storage:/data/cozy-storage - ./docker/disableCSP.yaml:/etc/cozy/cozy.yaml diff --git a/docker/cozy-app-dev-with-app.sh b/docker/cozy-app-dev-with-app.sh old mode 100644 new mode 100755 index b14d7c4bbc445a29bdf169ec31e32fab091538a0..3847650d3f0034fe2a57b16f38d23a88b1ee873d --- a/docker/cozy-app-dev-with-app.sh +++ b/docker/cozy-app-dev-with-app.sh @@ -190,17 +190,22 @@ do_create_instances() { } do_install_app() { - echo "Installing apps (home, collect..)" + echo "Installing apps home, store, collect" if cozy-stack apps ls | grep 'home'; then echo "Removing home..." cozy-stack apps uninstall home fi - if cozy-stack apps ls | grep 'collect'; then - echo "Removing collect..." - cozy-stack apps uninstall collect + if cozy-stack apps ls | grep 'store'; then + echo "Removing store..." + cozy-stack apps uninstall store fi - echo "Installing home, collect, store..." - + if cozy-stack apps ls | grep 'settings'; then + echo "Removing settings..." + cozy-stack apps uninstall settings + fi + cozy-stack apps install --all-domains home + cozy-stack apps install --all-domains store + cozy-stack apps install --all-domains settings echo "App succesfully installed" echo "Installing konnectors" diff --git a/package.json b/package.json index 8fbaf0d8cccebc48c3e3e1d9dcc95dc46116444b..bce03c091fa703e53828633ddc74c8aec447e271 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,6 @@ "build": "yarn run build:css && yarn run build:browser", "build-dev": "yarn run build:css && yarn run build-dev:browser", "release": "standard-version --no-verify", - "winstack": "start powershell -command docker run --rm -it -p 8080:8080 -p 5984:5984 -p 8025:8025 -v $PWD/build:/data/cozy-app/ecolyo -v $PWD/data:/usr/local/couchdb/data -v $PWD/docker/disableCSP.yaml:/etc/cozy/cozy.yaml registry.forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/cozy-env", - "linuxstack": "docker run --rm -it -p 8080:8080 -p 5984:5984 -p 8025:8025 -v $(pwd)/build:/data/cozy-app/ecolyo -v ~/cozy/data/db:/usr/local/couchdb/data -v ~/cozy/data/storage:/data/cozy-storage -v $(pwd)/docker/disableCSP.yaml:/etc/cozy/cozy.yaml registry.forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/cozy-env", "load-data": "cd test && importData.bat", "start-stack": "cs start --hot --browser --stack" }, diff --git a/src/components/Connection/ConnectionResult.tsx b/src/components/Connection/ConnectionResult.tsx index e3357ca96d3b9f8b4bcab6e701cb888cf51ccd5a..e5e94863b03e0a687dbb1d88b052d31dad6967e0 100644 --- a/src/components/Connection/ConnectionResult.tsx +++ b/src/components/Connection/ConnectionResult.tsx @@ -176,27 +176,32 @@ const ConnectionResult: React.FC<ConnectionResultProps> = ({ title="Attention" ariaHidden={false} /> - - <div className="text-16-normal"> - {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> + {konnectorError === 'login_failed' ? ( + <div className="text-16-normal"> + {t('konnector_form.login_failed')} + </div> + ) : ( + <div className="text-16-normal"> + {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 diff --git a/src/components/Home/FluidButton.tsx b/src/components/Home/FluidButton.tsx index e8c80f31034cc43b34f0c043a460670e35af2aa7..39cae3cf2cd42eab8bf2871af6ed3a0c6b5290ff 100644 --- a/src/components/Home/FluidButton.tsx +++ b/src/components/Home/FluidButton.tsx @@ -38,8 +38,10 @@ const FluidButton: React.FC<FluidButtonProps> = ({ const isErrored = useCallback(() => { if ( - fluidType !== FluidType.MULTIFLUID && - fluidStatus[fluidType].status === FluidState.ERROR + (fluidType !== FluidType.MULTIFLUID && + fluidStatus[fluidType].status === FluidState.ERROR) || + (fluidType !== FluidType.WATER && + fluidStatus[fluidType].status === FluidState.ERROR_LOGIN_FAILED) ) { return true } diff --git a/src/components/Konnector/KonnectorViewerCard.tsx b/src/components/Konnector/KonnectorViewerCard.tsx index d4c8098182432dc432703aca2fac730798208c73..db42376c6f019b40c3903d818259e6fffe7acf8a 100644 --- a/src/components/Konnector/KonnectorViewerCard.tsx +++ b/src/components/Konnector/KonnectorViewerCard.tsx @@ -255,10 +255,12 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ const getConnectionCard = useCallback(() => { if (fluidState === FluidState.KONNECTOR_NOT_FOUND && !isUpdating) { return <ConnectionNotFound konnectorSlug={fluidSlug} /> - } else if ( - account && - fluidState !== FluidState.ERROR_LOGIN_FAILED && - fluidStatus.status !== FluidState.NOT_CONNECTED + } + // Handle login failed for EGL + else if ( + (fluidState === FluidState.ERROR_LOGIN_FAILED && + fluidType === FluidType.WATER) || + (account && fluidStatus.status !== FluidState.NOT_CONNECTED) ) { return ( <ConnectionResult @@ -305,6 +307,73 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ updateGlobalFluidStatus, ] ) + const displayKonnectorIcon = useCallback(() => { + return ( + <div className="konnector-icon"> + {fluidStatus.connection.account ? ( + <Icon icon={iconType} size={49} /> + ) : ( + <Icon icon={iconAddType} size={49} /> + )} + {fluidStatus.status === FluidState.PARTNER_ISSUE ? ( + <StyledIcon + icon={PartnersIssueNotif} + size={24} + className="konnector-state-picto" + /> + ) : ( + (fluidStatus.status === FluidState.ERROR || + isOutdatedData || + fluidStatus.status === FluidState.ERROR_LOGIN_FAILED) && ( + <StyledIcon + icon={ErrorNotif} + size={24} + className="konnector-state-picto" + /> + ) + )} + </div> + ) + }, [ + fluidStatus.connection.account, + fluidStatus.status, + iconAddType, + iconType, + isOutdatedData, + ]) + + const displayKonnectorHeader = useCallback(() => { + if (fluidStatus.status === FluidState.PARTNER_ISSUE) { + return ( + <span className="text-16-bold"> + {t(`konnector_options.partner_issue`)} + </span> + ) + } else if (isOutdatedData && fluidStatus.connection.account) { + return ( + <span className="text-16-bold outdated"> + {t('konnector_options.outdated', { + // eslint-disable-next-line @typescript-eslint/camelcase + isOutdatedData: isOutdatedData, + })} + </span> + ) + } else if (fluidStatus.connection.account && !isOutdatedData) { + return t('FLUID.' + FluidType[fluidStatus.fluidType] + '.LABEL') + } else { + return t( + `konnector_options.label_connect_to_${FluidType[ + fluidStatus.fluidType + ].toLowerCase()}` + ) + } + }, [ + fluidStatus.connection.account, + fluidStatus.fluidType, + fluidStatus.status, + isOutdatedData, + t, + ]) useEffect(() => { let subscribed = true @@ -335,9 +404,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ callbackResponse(LOGIN_SUCCESS_EVENT) }) connectionFlow.jobWatcher.on(SUCCESS_EVENT, () => { - if (subscribed) { - sendUsageEventSuccess(fluidSlug, fluidStatus.lastDataDate === null) - } + sendUsageEventSuccess(fluidSlug, fluidStatus.lastDataDate === null) callbackResponse(SUCCESS_EVENT) }) } @@ -365,7 +432,6 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ sendUsageEventError, fluidSlug, sendUsageEventSuccess, - fluidStatus.connection, ]) useEffect(() => { @@ -409,27 +475,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ content: 'expansion-panel-content', }} > - <div className="konnector-icon"> - {fluidStatus.connection.account && - fluidStatus.status !== FluidState.ERROR_LOGIN_FAILED ? ( - <Icon icon={iconType} size={49} /> - ) : ( - <Icon icon={iconAddType} size={49} /> - )} - {fluidStatus.status === FluidState.PARTNER_ISSUE ? ( - <StyledIcon - icon={PartnersIssueNotif} - size={24} - className="konnector-state-picto" - /> - ) : fluidStatus.status === FluidState.ERROR || isOutdatedData ? ( - <StyledIcon - icon={ErrorNotif} - size={24} - className="konnector-state-picto" - /> - ) : null} - </div> + {displayKonnectorIcon()} <div className={classNames('konnector-title', { [`${FluidType[ @@ -439,25 +485,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({ fluidStatus.status !== FluidState.PARTNER_ISSUE, })} > - {fluidStatus.status === FluidState.PARTNER_ISSUE ? ( - <span className="text-16-bold"> - {t(`konnector_options.partner_issue`)} - </span> - ) : fluidStatus.connection.account && - fluidStatus.status !== FluidState.ERROR_LOGIN_FAILED && - !isOutdatedData ? ( - t('FLUID.' + FluidType[fluidStatus.fluidType] + '.LABEL') - ) : fluidStatus.status !== FluidState.ERROR_LOGIN_FAILED ? ( - <span className="text-16-bold outdated"> - Données manquantes depuis {isOutdatedData} jours - </span> - ) : ( - t( - `konnector_options.label_connect_to_${FluidType[ - fluidStatus.fluidType - ].toLowerCase()}` - ) - )} + {displayKonnectorHeader()} </div> </ExpansionPanelSummary> <ExpansionPanelDetails diff --git a/src/enum/konnectorUpdate.enum.ts b/src/enum/konnectorUpdate.enum.ts index 5923efb32cc658344ea3dde22f941a7ffe50a196..9d932853d7858d74d900f4af644f0fd4f7c61003 100644 --- a/src/enum/konnectorUpdate.enum.ts +++ b/src/enum/konnectorUpdate.enum.ts @@ -1,4 +1,5 @@ export enum KonnectorUpdate { ERROR_UPDATE = 'error_update', ERROR_UPDATE_OAUTH = 'error_update_oauth', + LOGIN_FAILED = 'login_failed', } diff --git a/src/locales/fr.json b/src/locales/fr.json index 147c7f91e0e7ee29591a18e8bff438e811e59e41..56d236eb74f5573f5477e72dabe14097b3f6f2ce 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -680,6 +680,7 @@ "button_delete": "Supprimer", "issue": "Le problème semble venir de ", "resolve": "Une mise à jour peut résoudre ce problème.", + "login_failed": "Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.", "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.", @@ -700,6 +701,7 @@ "label_connect_to_water": "Se connecter à l'eau", "label_connect_to_gas": "Se connecter au gaz", "partner_issue": "En maintenance", + "outdated": "Données manquantes depuis %{isOutdatedData} jours", "accessibility": { "label_ko_status": "Connecteur en erreur", "button_toggle_detail_electricity": "Afficher ou masquer le détail de la connexion à l'électricité", @@ -722,6 +724,8 @@ "error_data_water": "Un problème est survenu. Vos données de consommation d’eau ne seront pas chargées.", "error_credentials_water": "Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter. L'identifiant est un numéro à 7 chiffres (différent de votre numéro de contrat).", "error_credentials_update_water": "Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter.", + "error_credentials_update_electricity": "Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.", + "error_credentials_update_gas": "Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.", "error_data_gas": "Un problème est survenu. Vos données de consommmation de gaz ne seront pas chargées.", "error_data_update_electricity": "Un problème est survenu. Vos données de consommation d’électricité n’ont pas été mises à jour.", "error_data_update_water": "Un problème est survenu. Vos données de consommation d’eau n’ont pas été mises à jour.", diff --git a/src/store/global/global.reducer.ts b/src/store/global/global.reducer.ts index 0bbbbc10aa323af51df0cf642dc6c721fd93ebd4..143410b6af1e659743062bf72b53a20353230365 100644 --- a/src/store/global/global.reducer.ts +++ b/src/store/global/global.reducer.ts @@ -110,9 +110,12 @@ const getFluidTypesFromStatus = (fluidStatus: FluidStatus[]): FluidType[] => { const fluidTypes: FluidType[] = [] fluidStatus.forEach(fluid => { if ( - fluid.status !== FluidState.KONNECTOR_NOT_FOUND && - fluid.status !== FluidState.NOT_CONNECTED && - fluid.status !== FluidState.ERROR_LOGIN_FAILED + (fluid.status !== FluidState.KONNECTOR_NOT_FOUND && + fluid.status !== FluidState.NOT_CONNECTED && + fluid.status !== FluidState.ERROR_LOGIN_FAILED) || + //Handle Login Error case for oauth konnectors + (fluid.status === FluidState.ERROR_LOGIN_FAILED && + fluid.fluidType !== FluidType.WATER) ) { fluidTypes.push(fluid.fluidType) } diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 9489a28f540e8c99dc726b41fc2d2a4aa01a2248..2a7a70595f8270beb83fd52d3b0f4f375caef892 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -21,6 +21,8 @@ export function getKonnectorUpdateError(type: string) { switch (type.toUpperCase()) { case 'USER_ACTION_NEEDED.OAUTH_OUTDATED': return KonnectorUpdate.ERROR_UPDATE_OAUTH + case 'LOGIN_FAILED': + return KonnectorUpdate.LOGIN_FAILED default: return KonnectorUpdate.ERROR_UPDATE } @@ -35,7 +37,6 @@ export function isKonnectorActive( fluidStatus.filter( fluid => fluid.status === FluidState.NOT_CONNECTED || - fluid.status === FluidState.ERROR_LOGIN_FAILED || fluid.status === FluidState.KONNECTOR_NOT_FOUND ).length === 3 ) {