diff --git a/.vscode/settings.json b/.vscode/settings.json index ffbf33c12d2893bdddd89e3ba87c13f44982bf1c..b3f02083321ce59814f15b98a5ef2b92aa387f21 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -80,6 +80,7 @@ "eglgrandlyon", "elec", "élec", + "emas", "enedis", "Enedis", "ENEDIS", @@ -127,6 +128,7 @@ "notif", "numerique", "oeufs", + "pefs", "picto", "Picto", "PIV'EAU", @@ -153,7 +155,8 @@ "UNSTARTED", "usageevent", "Usain", - "userchallenge" + "userchallenge", + "weektype" ], "typescript.tsdk": "node_modules/typescript/lib", "conventionalCommits.scopes": ["ui", "ecogestures"] diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.tsx b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.tsx index b4a64e77f115d83106570606b527b27e5effa0d4..44bcc2b670387f373045c72260cf6ce98635aa75 100644 --- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.tsx +++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.tsx @@ -16,7 +16,7 @@ import { FluidPrice, PerformanceIndicator, } from 'models' -import React, { useCallback, useEffect, useState } from 'react' +import React, { useCallback, useEffect, useMemo, useState } from 'react' import ConsumptionService from 'services/consumption.service' import EnedisMonthlyAnalysisDataService from 'services/enedisMonthlyAnalysisData.service' import FluidPricesService from 'services/fluidsPrices.service' @@ -56,6 +56,12 @@ const ElecHalfHourMonthlyAnalysis = ({ setOpenInfoModal(prev => !prev) }, []) + /** EnedisMonthlyAnalysisDataService*/ + const emas = useMemo( + () => new EnedisMonthlyAnalysisDataService(client), + [client] + ) + const isDataFullyComplete = useCallback( (monthDataloads: AggregatedEnedisMonthlyDataloads | undefined) => { return ( @@ -90,7 +96,6 @@ const ElecHalfHourMonthlyAnalysis = ({ ) if (!subscribed) return if (isHalfHourLoadActivated) { - const emas = new EnedisMonthlyAnalysisDataService(client) const aggregatedDate = analysisMonth.minus({ month: 1 }) const data = await emas.getEnedisMonthlyAnalysisByDate( aggregatedDate.year, @@ -116,7 +121,7 @@ const ElecHalfHourMonthlyAnalysis = ({ return () => { subscribed = false } - }, [analysisMonth, client, perfIndicator]) + }, [analysisMonth, client, emas, perfIndicator]) useEffect(() => { let subscribed = true @@ -139,12 +144,9 @@ const ElecHalfHourMonthlyAnalysis = ({ useEffect(() => { let subscribed = true - const enedisMonthlyAnalysisDataService = - new EnedisMonthlyAnalysisDataService(client) async function getOffPeakHours() { if (subscribed) { - const offPeakHours = - await enedisMonthlyAnalysisDataService.getOffPeakHours() + const offPeakHours = await emas.getOffPeakHours() if (offPeakHours) { setOffPeakHours(offPeakHours) } @@ -155,7 +157,7 @@ const ElecHalfHourMonthlyAnalysis = ({ return () => { subscribed = false } - }, [client]) + }, [emas]) return ( <div className="special-elec-container"> diff --git a/src/components/Challenge/ChallengeCardOnGoing/ChallengeCardOnGoing.tsx b/src/components/Challenge/ChallengeCardOnGoing/ChallengeCardOnGoing.tsx index 028d698b59eac6ab1ff51946552ec155364d1d8c..cdeb8d6ced57367c32eee675b20683aba75b66dd 100644 --- a/src/components/Challenge/ChallengeCardOnGoing/ChallengeCardOnGoing.tsx +++ b/src/components/Challenge/ChallengeCardOnGoing/ChallengeCardOnGoing.tsx @@ -19,7 +19,7 @@ import { UserQuizState, } from 'enums' import { UserChallenge } from 'models' -import React, { useCallback, useEffect, useState } from 'react' +import React, { useCallback, useEffect, useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' import ChallengeService from 'services/challenge.service' import { updateUserChallengeList } from 'store/challenge/challenge.slice' @@ -59,12 +59,13 @@ const ChallengeCardOnGoing = ({ setIsOneFluidUp(prev => !prev) }, []) + const challengeService = useMemo(() => new ChallengeService(client), [client]) + const goDuel = async () => { setIsLoading(true) // Check if at least one fluid is up if (fluidTypes.length !== 0) { if (userChallenge.duel.state !== UserDuelState.ONGOING) { - const challengeService = new ChallengeService(client) const updatedChallenge = await challengeService.updateUserChallenge( userChallenge, UserChallengeUpdateFlag.DUEL_UPDATE_THRESHOLD, @@ -83,7 +84,6 @@ const ChallengeCardOnGoing = ({ const goQuiz = async () => { if (userChallenge.quiz.state !== UserQuizState.ONGOING) { - const challengeService = new ChallengeService(client) const updatedChallenge = await challengeService.updateUserChallenge( userChallenge, UserChallengeUpdateFlag.QUIZ_RESET @@ -119,7 +119,6 @@ const ChallengeCardOnGoing = ({ }, [userChallenge]) useEffect(() => { - const challengeService = new ChallengeService(client) let subscribed = true async function setChallengeResult() { const isChallengeDone = await challengeService.isChallengeDone( @@ -156,7 +155,7 @@ const ChallengeCardOnGoing = ({ return () => { subscribed = false } - }, [client, currentDataload, userChallenge, dispatch]) + }, [currentDataload, userChallenge, dispatch, challengeService]) const quizButton = () => ( <Button diff --git a/src/components/Consumption/ConsumptionView.tsx b/src/components/Consumption/ConsumptionView.tsx index 4e8f415f752f5f37835786b0e09f7444f9b2a697..5b13626490267657c865d676f9627973c77d2a73 100644 --- a/src/components/Consumption/ConsumptionView.tsx +++ b/src/components/Consumption/ConsumptionView.tsx @@ -12,7 +12,7 @@ import ReleaseNotesModal from 'components/ReleaseNotesModal/ReleaseNotesModal' import { useClient } from 'cozy-client' import { FluidState, FluidType, TimeStep } from 'enums' import { DateTime } from 'luxon' -import React, { useCallback, useEffect, useState } from 'react' +import React, { useCallback, useEffect, useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' import DateChartService from 'services/dateChart.service' import ProfileService from 'services/profile.service' @@ -61,6 +61,8 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => { [] ) + const profileService = useMemo(() => new ProfileService(client), [client]) + const updateKey = !isMulti && currentFluidStatus.lastDataDate ? `${currentFluidStatus.lastDataDate.toLocaleString()} + ${ @@ -100,7 +102,6 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => { }, [dispatch, navigate, releaseNotes.notes, releaseNotes.redirectLink]) const handleClosePartnerIssueModal = useCallback(async () => { - const profileService = new ProfileService(client) const profileValues = await profileService.getProfile() if (profileValues) { const updatedProfile = await profileService.updateProfile({ @@ -118,10 +119,9 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => { ) } } - }, [client, dispatch, fluidType, partnersIssueModal]) + }, [dispatch, fluidType, partnersIssueModal, profileService]) const handleCloseCustomPopupModal = async () => { - const profileService = new ProfileService(client) const updatedProfile = await profileService.updateProfile({ customPopupDate: getTodayDate(), }) diff --git a/src/components/Duel/DuelOngoing/DuelOngoing.tsx b/src/components/Duel/DuelOngoing/DuelOngoing.tsx index d0ea2a2b03882d64ee2de72e8a864fcd7824626d..e5f8335b43654c066cdb4492f4835e49ae55884d 100644 --- a/src/components/Duel/DuelOngoing/DuelOngoing.tsx +++ b/src/components/Duel/DuelOngoing/DuelOngoing.tsx @@ -58,7 +58,6 @@ const DuelOngoing = ({ userChallenge, isFinished }: DuelOngoingProps) => { const average = formatNumberValues(userChallenge.duel.threshold).toString() const setResult = useCallback(async () => { - const challengeService = new ChallengeService(client) const updatedChallenge = await challengeService.updateUserChallenge( userChallenge, winChallenge @@ -74,7 +73,14 @@ const DuelOngoing = ({ userChallenge, isFinished }: DuelOngoingProps) => { } else { navigate('/challenges') } - }, [client, userChallenge, winChallenge, dispatch, isLastDuel, navigate]) + }, [ + challengeService, + userChallenge, + winChallenge, + dispatch, + isLastDuel, + navigate, + ]) useEffect(() => { let subscribed = true diff --git a/src/components/Ecogesture/EcogestureTabsView.tsx b/src/components/Ecogesture/EcogestureTabsView.tsx index 65302f8b6615809abceaa08f1d611918ed83b841..f968257255b60a1a1d08624853602f1be02a1dce 100644 --- a/src/components/Ecogesture/EcogestureTabsView.tsx +++ b/src/components/Ecogesture/EcogestureTabsView.tsx @@ -138,8 +138,6 @@ const EcogestureTabsView = () => { useEffect(() => { let subscribed = true async function loadEcogestures() { - const ecogestureService = new EcogestureService(client) - const currentProfile = profile.isProfileTypeCompleted ? profileType : profileEcogesture @@ -177,12 +175,12 @@ const EcogestureTabsView = () => { subscribed = false } }, [ - client, profileEcogesture, profileType, dispatch, profile.ecogestureHash, profile.isProfileTypeCompleted, + ecogestureService, ]) return ( diff --git a/src/components/EcogestureForm/EcogestureFormView.tsx b/src/components/EcogestureForm/EcogestureFormView.tsx index 1e51c9785fa35b30bc9b830b3c70d6c83363d31b..337592ae8141bb394a64e3f577b6c5ee1c384244 100644 --- a/src/components/EcogestureForm/EcogestureFormView.tsx +++ b/src/components/EcogestureForm/EcogestureFormView.tsx @@ -5,7 +5,7 @@ import Loader from 'components/Loader/Loader' import ProfileTypeView from 'components/ProfileType/ProfileTypeView' import { EcogestureStepForm, ProfileEcogestureAnswerType } from 'enums' import { ProfileEcogesture, ProfileEcogestureAnswer } from 'models' -import React, { useCallback, useEffect, useState } from 'react' +import React, { useCallback, useEffect, useMemo, useState } from 'react' import { useLocation, useNavigate } from 'react-router-dom' import ProfileEcogestureFormService from 'services/profileEcogestureForm.service' import { useAppDispatch, useAppSelector } from 'store/hooks' @@ -24,6 +24,7 @@ const EcogestureFormView = () => { } = useAppSelector(state => state.ecolyo) const shouldOpenModal = new URLSearchParams(useLocation().search).get('modal') + const [step, setStep] = useState<EcogestureStepForm>( EcogestureStepForm.HEATING_TYPE ) @@ -32,7 +33,6 @@ const EcogestureFormView = () => { attribute: 'heating', choices: [], }) - const [isLoading, setIsLoading] = useState<boolean>(true) const [openLaunchModal, setOpenLaunchModal] = useState<boolean>( shouldOpenModal !== 'false' ? true : false @@ -40,10 +40,16 @@ const EcogestureFormView = () => { const [viewedStep, setViewedStep] = useState<number>(-1) const [currentProfileEcogesture, setCurrentProfileEcogesture] = useState<ProfileEcogesture>(profileEcogesture) + + /** ProfileEcogestureFormService */ + const pefs = useMemo( + () => new ProfileEcogestureFormService(profileEcogesture), + [profileEcogesture] + ) + const setNextStep = useCallback( (_profileEcogesture: ProfileEcogesture) => { setCurrentProfileEcogesture(_profileEcogesture) - const pefs = new ProfileEcogestureFormService(_profileEcogesture) const nextStep = pefs.getNextFormStep(step) setIsLoading(true) if (nextStep > viewedStep) { @@ -54,17 +60,16 @@ const EcogestureFormView = () => { setAnswerType(_answerType) setStep(nextStep) }, - [step, viewedStep] + [pefs, step, viewedStep] ) const setPreviousStep = useCallback(() => { - const pefs = new ProfileEcogestureFormService(currentProfileEcogesture) const previousStep = pefs.getPreviousFormStep(step) setIsLoading(true) const _answerType = ProfileEcogestureFormService.getAnswerForStep(previousStep) setAnswerType(_answerType) setStep(previousStep) - }, [currentProfileEcogesture, step]) + }, [pefs, step]) const handleEndForm = useCallback(() => { dispatch(newProfileEcogestureEntry(currentProfileEcogesture)) diff --git a/src/components/Exploration/ExplorationOngoing.tsx b/src/components/Exploration/ExplorationOngoing.tsx index 850f4aabd717e9c86057be61e586670c49080ad6..347081ae2935b8ac21e527414341c2829c2d3059 100644 --- a/src/components/Exploration/ExplorationOngoing.tsx +++ b/src/components/Exploration/ExplorationOngoing.tsx @@ -26,9 +26,11 @@ const ExplorationOngoing = ({ userChallenge }: ExplorationOngoingProps) => { const client = useClient() const dispatch = useAppDispatch() const navigate = useNavigate() + + const challengeService = new ChallengeService(client) + const startExploration = async () => { if (userChallenge.exploration.state !== UserExplorationState.ONGOING) { - const challengeService = new ChallengeService(client) const updatedChallenge = await challengeService.updateUserChallenge( userChallenge, UserChallengeUpdateFlag.EXPLORATION_START @@ -39,7 +41,6 @@ const ExplorationOngoing = ({ userChallenge }: ExplorationOngoingProps) => { } const validExploration = async () => { - const challengeService = new ChallengeService(client) const updatedChallenge = await challengeService.updateUserChallenge( userChallenge, UserChallengeUpdateFlag.EXPLORATION_DONE diff --git a/src/components/Konnector/KonnectorViewerCard.tsx b/src/components/Konnector/KonnectorViewerCard.tsx index 3e5a4bff1729b430aec22a3b8d07e473818e7eba..91096b619b35cdc7b282dcaa19b014b05f7f02f1 100644 --- a/src/components/Konnector/KonnectorViewerCard.tsx +++ b/src/components/Konnector/KonnectorViewerCard.tsx @@ -95,6 +95,7 @@ const KonnectorViewerCard = ({ currentFluidStatus.status === FluidState.CHALLENGE_ASKED const fluidService = useMemo(() => new FluidService(client), [client]) + const accountService = useMemo(() => new AccountService(client), [client]) const partnersInfoService = useMemo( () => new PartnersInfoService(client), [client] @@ -197,7 +198,6 @@ const KonnectorViewerCard = ({ dispatch(setLastEpglLogin(lastEpglLogin)) } // DELETE ACCOUNT - const accountService = new AccountService(client) await accountService.deleteAccount(account) await handleAccountDeletion() } else { @@ -212,14 +212,14 @@ const KonnectorViewerCard = ({ }, [ konnectorErrorDescription, - currentFluidStatus, fluidType, + currentFluidStatus, + dispatch, fluidSlug, - client, + accountService, handleAccountDeletion, fluidService, partnersInfo, - dispatch, ] ) @@ -389,13 +389,12 @@ const KonnectorViewerCard = ({ useEffect(() => { async function deleteAccountForConsentRefresh() { if (shouldRefreshConsent && account) { - const accountService = new AccountService(client) await accountService.deleteAccount(account) await handleAccountDeletion() } } deleteAccountForConsentRefresh() - }, [account, client, handleAccountDeletion, shouldRefreshConsent]) + }, [account, accountService, handleAccountDeletion, shouldRefreshConsent]) useEffect(() => { let subscribed = true diff --git a/src/components/Quiz/QuizQuestion/QuizQuestionContent.tsx b/src/components/Quiz/QuizQuestion/QuizQuestionContent.tsx index 74a8effc665cf8a43225ae16b407d246c21f12fc..eb59925814374d01f1b630783c21b082cbb32db6 100644 --- a/src/components/Quiz/QuizQuestion/QuizQuestionContent.tsx +++ b/src/components/Quiz/QuizQuestion/QuizQuestionContent.tsx @@ -5,7 +5,7 @@ import QuizExplanationModal from 'components/Quiz/QuizExplanationModal/QuizExpla import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { UserChallengeUpdateFlag } from 'enums' -import { Answer, UserChallenge, UserQuiz } from 'models' +import { UserChallenge } from 'models' import React, { Dispatch, SetStateAction, useCallback, useState } from 'react' import ChallengeService from 'services/challenge.service' import QuizService from 'services/quiz.service' @@ -36,29 +36,28 @@ const QuizQuestionContent = ({ const [questionIndex, setQuestionIndex] = useState<number>(questionIndexLocked) - const quizService: QuizService = new QuizService(client) - const challengeService: ChallengeService = new ChallengeService(client) + const quizService = new QuizService(client) + const challengeService = new ChallengeService(client) const validateQuestion = async () => { - const resultIndex: number = userChallenge.quiz.questions[ + const resultIndex = userChallenge.quiz.questions[ questionIndex ].answers.findIndex(answer => answer.answerLabel === userChoice) - const result: Answer[] = userChallenge.quiz.questions[ - questionIndex - ].answers.filter(answer => answer.answerLabel === userChoice) + const result = userChallenge.quiz.questions[questionIndex].answers.filter( + answer => answer.answerLabel === userChoice + ) setAnswerIndex(resultIndex) setOpenModal(true) - const quizUpdated: UserQuiz = await quizService.updateUserQuiz( + const quizUpdated = await quizService.updateUserQuiz( userChallenge.quiz, result[0].isTrue, questionIndex ) - const userChallengeUpdated: UserChallenge = - await challengeService.updateUserChallenge( - userChallenge, - UserChallengeUpdateFlag.QUIZ_UPDATE, - quizUpdated - ) + const userChallengeUpdated = await challengeService.updateUserChallenge( + userChallenge, + UserChallengeUpdateFlag.QUIZ_UPDATE, + quizUpdated + ) dispatch(updateUserChallengeList(userChallengeUpdated)) } diff --git a/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.tsx b/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.tsx index 72cf01ba2719b26e4da2132d41193389d67eaf70..f37f638feef599af138a08aab4538c714f7485f3 100644 --- a/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.tsx +++ b/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.tsx @@ -6,7 +6,7 @@ import QuizExplanationModal from 'components/Quiz/QuizExplanationModal/QuizExpla import { useClient } from 'cozy-client' import { useI18n } from 'cozy-ui/transpiled/react/I18n' import { UserChallengeUpdateFlag } from 'enums' -import { Answer, QuestionEntity, UserChallenge, UserQuiz } from 'models' +import { QuestionEntity, UserChallenge } from 'models' import React, { useState } from 'react' import ChallengeService from 'services/challenge.service' import QuizService from 'services/quiz.service' @@ -34,30 +34,29 @@ const QuizQuestionContentCustom = ({ const [userChoice, setUserChoice] = useState<string>('') const [openModal, setOpenModal] = useState<boolean>(false) const [answerIndex, setAnswerIndex] = useState<number>(0) - const quizService: QuizService = new QuizService(client) - const challengeService: ChallengeService = new ChallengeService(client) + const quizService = new QuizService(client) + const challengeService = new ChallengeService(client) const validateQuestion = async () => { if (question) { - const resultIndex: number = question.answers.findIndex( + const resultIndex = question.answers.findIndex( answer => answer.answerLabel === userChoice ) setAnswerIndex(resultIndex) setOpenModal(true) - const result: Answer[] = question.answers.filter( + const result = question.answers.filter( answer => answer.answerLabel === userChoice ) - const quizUpdated: UserQuiz = await quizService.updateUserQuiz( + const quizUpdated = await quizService.updateUserQuiz( userChallenge.quiz, result[0].isTrue ) - const userChallengeUpdated: UserChallenge = - await challengeService.updateUserChallenge( - userChallenge, - UserChallengeUpdateFlag.QUIZ_UPDATE, - quizUpdated - ) + const userChallengeUpdated = await challengeService.updateUserChallenge( + userChallenge, + UserChallengeUpdateFlag.QUIZ_UPDATE, + quizUpdated + ) dispatch(updateUserChallengeList(userChallengeUpdated)) } } @@ -68,11 +67,10 @@ const QuizQuestionContentCustom = ({ const finishQuiz = async () => { setOpenModal(false) - const userChallengeUpdated: UserChallenge = - await challengeService.updateUserChallenge( - userChallenge, - UserChallengeUpdateFlag.QUIZ_DONE - ) + const userChallengeUpdated = await challengeService.updateUserChallenge( + userChallenge, + UserChallengeUpdateFlag.QUIZ_DONE + ) dispatch(updateUserChallengeList(userChallengeUpdated)) } diff --git a/src/targets/services/aggregatorUsageEvents.ts b/src/targets/services/aggregatorUsageEvents.ts index 841b3f7842883c54d03261fdccbac1e74c84f63a..36beffe25a1f122a126fba16ff2bdab6f2dd8120 100644 --- a/src/targets/services/aggregatorUsageEvents.ts +++ b/src/targets/services/aggregatorUsageEvents.ts @@ -11,7 +11,7 @@ import { } from 'enums' import { uniq } from 'lodash' import { DateTime } from 'luxon' -import { FluidStatus, PerformanceIndicator, UsageEvent } from 'models' +import { PerformanceIndicator, UsageEvent } from 'models' import ConsumptionService from 'services/consumption.service' import EnvironmentService from 'services/environment.service' import FluidService from 'services/fluid.service' @@ -121,8 +121,8 @@ const getConnectedKonnectorSlug = ( } const calculateConnectedKonnectorPerDay = async (client: Client) => { - const fluidService: FluidService = new FluidService(client) - const fluidStatus: FluidStatus[] = await fluidService.getFluidStatus() + const fluidService = new FluidService(client) + const fluidStatus = await fluidService.getFluidStatus() const connectedKonnectors = fluidStatus.filter( fluid => fluid.status === FluidState.DONE )