From ddbc9ee6a923f237b247445c0fda63d3dc7b3382 Mon Sep 17 00:00:00 2001 From: Theo Gautier Date: Mon, 23 Sep 2024 11:18:42 +0200 Subject: [PATCH 1/4] a11y: from leanBe to Wordpress --- app/(connected)/layout.tsx | 9 +++- components/ActualitesModal.tsx | 77 ++++++++++++++++++++++++++++++++++ components/NavLinks.tsx | 54 +++++++++++++++++++++--- fixtures/actualites.ts | 3 ++ fixtures/conseiller.ts | 1 + interfaces/conseiller.ts | 13 ++++++ interfaces/json/conseiller.ts | 10 ++++- services/actualites.service.ts | 12 ++++++ services/conseiller.service.ts | 11 +++++ tests/renderWithContexts.tsx | 63 ++++++++++++++++------------ utils/AppContextProviders.tsx | 47 ++++++++++++--------- utils/actualitesContext.tsx | 35 ++++++++++++++++ 12 files changed, 280 insertions(+), 55 deletions(-) create mode 100644 components/ActualitesModal.tsx create mode 100644 fixtures/actualites.ts create mode 100644 services/actualites.service.ts create mode 100644 utils/actualitesContext.tsx diff --git a/app/(connected)/layout.tsx b/app/(connected)/layout.tsx index 2bcbb8a80..d10841026 100644 --- a/app/(connected)/layout.tsx +++ b/app/(connected)/layout.tsx @@ -9,6 +9,7 @@ import { getBeneficiairesDuConseillerServerSide } from 'services/beneficiaires.s import { getConseillerServerSide } from 'services/conseiller.service' import AppContextProviders from 'utils/AppContextProviders' import { getMandatorySessionServerSide } from 'utils/auth/auth' +import { getActualites } from 'services/actualites.service' export async function generateMetadata(): Promise { const { accessToken, user } = await getMandatorySessionServerSide() @@ -31,9 +32,15 @@ export default async function LayoutWhenConnected({ getBeneficiairesDuConseillerServerSide(user.id, accessToken), ]) + const actualitesData = await getActualites() + return ( <> - + diff --git a/components/ActualitesModal.tsx b/components/ActualitesModal.tsx new file mode 100644 index 000000000..3aea11a0a --- /dev/null +++ b/components/ActualitesModal.tsx @@ -0,0 +1,77 @@ +import parse, { domToReact } from 'html-react-parser' +import React, { useRef } from 'react' +import sanitizeHtml from 'sanitize-html' + +import { ModalHandles } from 'components/Modal' +import ModalContainer from 'components/ModalContainer' +import IconComponent, { IconName } from 'components/ui/IconComponent' +import { useActualites } from 'utils/actualitesContext' + +interface ActualitesModalProps { + onClose: () => void +} + +export default function ActualitesModal({ onClose }: ActualitesModalProps) { + const modalRef = useRef(null) + const [actualites] = useActualites() + + function formaterTexteAvecTag(texteAFormater: string) { + const texteAssaini = sanitizeHtml(texteAFormater, { + disallowedTagsMode: 'recursiveEscape', + allowedTags: sanitizeHtml.defaults.allowedTags.concat(['img']), + }) + + const texteEnrichi = texteAssaini + .replace( + /{/g, + "" + ) + .replace(/}/g, '') + + return parse(texteEnrichi) + } + + const modalTemplate = ( +
+
+
+ +
+ +
+ +
+
+ {formaterTexteAvecTag(actualites)} +
+
+
+ ) + + return ( + + {modalTemplate} + + ) +} diff --git a/components/NavLinks.tsx b/components/NavLinks.tsx index bb68fa447..958d69acb 100644 --- a/components/NavLinks.tsx +++ b/components/NavLinks.tsx @@ -1,12 +1,21 @@ 'use client' +import { DateTime } from 'luxon' import { usePathname, useRouter } from 'next/navigation' -import React from 'react' +import React, { useState } from 'react' import ActualitesMenuButton from 'components/ActualitesMenuButton' +import ActualitesModal from 'components/ActualitesModal' import NavLink from 'components/ui/Form/NavLink' import { IconName } from 'components/ui/IconComponent' -import { estMilo, estSuperviseur, utiliseChat } from 'interfaces/conseiller' +import { + aDeNouvellesActualites, + estMilo, + estSuperviseur, + utiliseChat, +} from 'interfaces/conseiller' +import { modifierDateVisionnageActus } from 'services/conseiller.service' +import { useActualites } from 'utils/actualitesContext' import { trackEvent } from 'utils/analytics/matomo' import { useConseiller } from 'utils/conseiller/conseillerContext' import { usePortefeuille } from 'utils/portefeuilleContext' @@ -34,6 +43,10 @@ export default function NavLinks({ const pathname = usePathname() const [conseiller] = useConseiller() const [portefeuille] = usePortefeuille() + const [actualites] = useActualites() + + const [afficherActualiteModal, setAfficherActualiteModal] = + useState(false) const aDesBeneficiaires = portefeuille.length > 0 const lienProfilBadgeLabel = !conseiller.email @@ -65,6 +78,12 @@ export default function NavLinks({ }) } + async function ouvrirActualites() { + setAfficherActualiteModal(true) + modifierDateVisionnageActus(DateTime.now()) + trackActualite() + } + return ( <>
    @@ -181,10 +200,29 @@ export default function NavLinks({ {process.env.NEXT_PUBLIC_ENABLE_LEANBE === 'true' && items.includes(NavItem.Actualites) && ( - + <> + {estMilo(conseiller) && ( + + )} + + {!estMilo(conseiller) && ( + + )} + )}
    @@ -222,6 +260,10 @@ export default function NavLinks({ showLabelOnSmallScreen={showLabelsOnSmallScreen} />
+ + {afficherActualiteModal && ( + setAfficherActualiteModal(false)} /> + )} ) } diff --git a/fixtures/actualites.ts b/fixtures/actualites.ts new file mode 100644 index 000000000..5ba9cf3e7 --- /dev/null +++ b/fixtures/actualites.ts @@ -0,0 +1,3 @@ +export const uneActualite = () => { + return "

Nouveauté

http://www.google.com" +} diff --git a/fixtures/conseiller.ts b/fixtures/conseiller.ts index 92516cf88..0e22ac05a 100644 --- a/fixtures/conseiller.ts +++ b/fixtures/conseiller.ts @@ -40,6 +40,7 @@ export const unConseillerJson = ( notificationsSonores: false, aDesBeneficiairesARecuperer: false, dateSignatureCGU: '2023-10-03', + dateVisionnageActus: '2023-10-03', } return { ...defaults, ...overrides } } diff --git a/interfaces/conseiller.ts b/interfaces/conseiller.ts index edd1ec63e..a7fd5d0e6 100644 --- a/interfaces/conseiller.ts +++ b/interfaces/conseiller.ts @@ -34,6 +34,7 @@ export interface Conseiller extends BaseConseiller { agence?: { nom: string; id?: string } structureMilo?: { id: string; nom: string } dateSignatureCGU?: string + dateVisionnageActus?: string } export function estMilo(conseiller: Conseiller): boolean { @@ -114,3 +115,15 @@ export function doitSignerLesCGU(conseiller: Conseiller): boolean { : DateTime.fromISO(conseiller.dateSignatureCGU) < DateTime.fromISO(process.env.VERSION_CGU_CEJ_COURANTE!) } + +export function aDeNouvellesActualites( + { dateVisionnageActus }: Conseiller, + dernierePublication: string +): boolean { + if (!dateVisionnageActus) return true + + return ( + DateTime.fromISO(dateVisionnageActus) < + DateTime.fromISO(dernierePublication) + ) +} diff --git a/interfaces/json/conseiller.ts b/interfaces/json/conseiller.ts index c90b5923f..26f58b456 100644 --- a/interfaces/json/conseiller.ts +++ b/interfaces/json/conseiller.ts @@ -1,11 +1,11 @@ import { Session } from 'next-auth' +import { ConseillerHistorique } from 'interfaces/beneficiaire' import { BaseConseiller, Conseiller, StructureConseiller, } from 'interfaces/conseiller' -import { ConseillerHistorique } from 'interfaces/beneficiaire' export interface ConseillerHistoriqueJson { id: string @@ -48,6 +48,7 @@ export interface ConseillerJson { notificationsSonores: boolean aDesBeneficiairesARecuperer: boolean dateSignatureCGU?: string + dateVisionnageActus?: string } export function jsonToBaseConseiller(json: BaseConseillerJson): BaseConseiller { @@ -64,7 +65,8 @@ export function jsonToConseiller( conseillerJson: ConseillerJson, { structure, estSuperviseur, estSuperviseurResponsable }: Session.HydratedUser ): Conseiller { - const { agence, dateSignatureCGU, ...json } = conseillerJson + const { agence, dateSignatureCGU, dateVisionnageActus, ...json } = + conseillerJson const conseiller: Conseiller = { ...json, structure: structure as StructureConseiller, @@ -80,5 +82,9 @@ export function jsonToConseiller( conseiller.dateSignatureCGU = dateSignatureCGU } + if (dateVisionnageActus) { + conseiller.dateVisionnageActus = dateVisionnageActus + } + return conseiller } diff --git a/services/actualites.service.ts b/services/actualites.service.ts new file mode 100644 index 000000000..0f14eeca6 --- /dev/null +++ b/services/actualites.service.ts @@ -0,0 +1,12 @@ +import { fetchJson } from 'utils/httpClient' + +export async function getActualites() { + const url = process.env.NEXT_PUBLIC_WORDPRESS_ACTUS_CEJ_LINK as string + const { + content: { + content: { rendered }, + }, + } = await fetchJson(url) + + return rendered +} diff --git a/services/conseiller.service.ts b/services/conseiller.service.ts index 022bb2319..674fad2e0 100644 --- a/services/conseiller.service.ts +++ b/services/conseiller.service.ts @@ -72,6 +72,17 @@ export async function modifierDateSignatureCGU(date: DateTime): Promise { ) } +export async function modifierDateVisionnageActus( + date: DateTime +): Promise { + const session = await getSession() + return apiPut( + `/conseillers/${session!.user.id}`, + { dateVisionnageActus: date }, + session!.accessToken + ) +} + export async function modifierNotificationsSonores( idConseiller: string, hasNotificationsSonores: boolean diff --git a/tests/renderWithContexts.tsx b/tests/renderWithContexts.tsx index 8529f4fcf..a8dda6c56 100644 --- a/tests/renderWithContexts.tsx +++ b/tests/renderWithContexts.tsx @@ -1,6 +1,7 @@ import { render, RenderResult } from '@testing-library/react' import React, { Dispatch, ReactNode, SetStateAction } from 'react' +import { uneActualite } from 'fixtures/actualites' import { desItemsBeneficiaires, extractBaseBeneficiaire, @@ -9,7 +10,9 @@ import { unConseiller } from 'fixtures/conseiller' import { BaseBeneficiaire, BeneficiaireEtChat } from 'interfaces/beneficiaire' import { Conseiller } from 'interfaces/conseiller' import { AlerteParam } from 'referentiel/alerteParam' +import { ActualitesProvider } from 'utils/actualitesContext' import { Alerte, AlerteProvider } from 'utils/alerteContext' +import { RenderedWPPageType } from 'utils/AppContextProviders' import { ChatCredentialsProvider } from 'utils/chat/chatCredentialsContext' import { ChatsProvider } from 'utils/chat/chatsContext' import { @@ -62,6 +65,8 @@ export default function renderWithContexts( } = options const conseiller = unConseiller(customConseiller) + const actualites = uneActualite() + const portefeuille = { ...customPortefeuille, value: @@ -77,6 +82,7 @@ export default function renderWithContexts( const listeDeDiffusionSelectionnee = { ...customListeDeDiffusionSelectionnee } const withContexts = (element: ReactNode) => provideContexts( + actualites, element, conseiller, portefeuille, @@ -97,6 +103,7 @@ export default function renderWithContexts( } function provideContexts( + actualites: string, children: ReactNode, conseiller: Conseiller, portefeuille: Partial<{ @@ -127,36 +134,38 @@ function provideContexts( portefeuille={portefeuille.value ?? []} setterForTests={portefeuille.setter} > - - - - + + + - - - {children} - - - - - - + + {children} + + + + + + + ) diff --git a/utils/AppContextProviders.tsx b/utils/AppContextProviders.tsx index 022b2a63c..b31a4e89c 100644 --- a/utils/AppContextProviders.tsx +++ b/utils/AppContextProviders.tsx @@ -10,6 +10,7 @@ import { compareBeneficiairesByNom, } from 'interfaces/beneficiaire' import { Conseiller, estPassEmploi } from 'interfaces/conseiller' +import { ActualitesProvider } from 'utils/actualitesContext' import { AlerteProvider } from 'utils/alerteContext' import { ChatCredentialsProvider } from 'utils/chat/chatCredentialsContext' import { ChatsProvider } from 'utils/chat/chatsContext' @@ -20,13 +21,19 @@ import { ConseillerProvider } from 'utils/conseiller/conseillerContext' import { MobileViewportProvider } from 'utils/mobileViewportContext' import { PortefeuilleProvider } from 'utils/portefeuilleContext' +export type RenderedWPPageType = { + rendered: string +} + export default function AppContextProviders({ conseiller, portefeuille, + actualitesData, children, }: { conseiller: Conseiller portefeuille: BeneficiaireFromListe[] + actualitesData: string children: ReactNode }) { const portefeuilleTrie = portefeuille @@ -45,25 +52,27 @@ export default function AppContextProviders({ - - - - - - - - {children} - - - - - - - + + + + + + + + + {children} + + + + + + + + diff --git a/utils/actualitesContext.tsx b/utils/actualitesContext.tsx new file mode 100644 index 000000000..4834fd9b1 --- /dev/null +++ b/utils/actualitesContext.tsx @@ -0,0 +1,35 @@ +'use client' + +import { createContext, ReactNode, useContext, useState } from 'react' + +type ActualitesState = [string, (updatedActualites: string) => void] + +const ActualitesContext = createContext(undefined) + +export function ActualitesProvider({ + children, + actualites, + setterForTests, +}: { + children: ReactNode + actualites: string + setterForTests?: (updatedActualites: string) => void +}) { + const [state, setActualites] = useState(actualites) + const setter = setterForTests ?? setActualites + + return ( + + {children} + + ) +} + +export function useActualites(): ActualitesState { + const actualitesContext = useContext(ActualitesContext) + if (!actualitesContext) { + throw new Error('useActualites must be used within ActualitesProvider') + } + + return actualitesContext +} From e2846550919419dd2b8c82405caa06c30c101dc3 Mon Sep 17 00:00:00 2001 From: Arthur L-Brjc Date: Thu, 31 Oct 2024 15:21:04 +0100 Subject: [PATCH 2/4] fix: retours revue --- app/(connected)/layout.tsx | 9 +---- components/ActualitesModal.tsx | 9 +++-- components/NavLinks.tsx | 8 +++-- fixtures/actualites.ts | 10 ++++-- interfaces/actualites.ts | 4 +++ services/actualites.service.ts | 13 +++++-- tests/renderWithContexts.tsx | 6 ++-- tests/services/conseiller.service.test.ts | 12 ++++--- utils/AppContextProviders.tsx | 8 +---- utils/actualitesContext.tsx | 41 +++++++++++++++-------- 10 files changed, 71 insertions(+), 49 deletions(-) create mode 100644 interfaces/actualites.ts diff --git a/app/(connected)/layout.tsx b/app/(connected)/layout.tsx index d10841026..2bcbb8a80 100644 --- a/app/(connected)/layout.tsx +++ b/app/(connected)/layout.tsx @@ -9,7 +9,6 @@ import { getBeneficiairesDuConseillerServerSide } from 'services/beneficiaires.s import { getConseillerServerSide } from 'services/conseiller.service' import AppContextProviders from 'utils/AppContextProviders' import { getMandatorySessionServerSide } from 'utils/auth/auth' -import { getActualites } from 'services/actualites.service' export async function generateMetadata(): Promise { const { accessToken, user } = await getMandatorySessionServerSide() @@ -32,15 +31,9 @@ export default async function LayoutWhenConnected({ getBeneficiairesDuConseillerServerSide(user.id, accessToken), ]) - const actualitesData = await getActualites() - return ( <> - + diff --git a/components/ActualitesModal.tsx b/components/ActualitesModal.tsx index 3aea11a0a..a02cb3ef0 100644 --- a/components/ActualitesModal.tsx +++ b/components/ActualitesModal.tsx @@ -1,9 +1,8 @@ -import parse, { domToReact } from 'html-react-parser' +import parse from 'html-react-parser' import React, { useRef } from 'react' import sanitizeHtml from 'sanitize-html' -import { ModalHandles } from 'components/Modal' -import ModalContainer from 'components/ModalContainer' +import ModalContainer, { ModalHandles } from 'components/ModalContainer' import IconComponent, { IconName } from 'components/ui/IconComponent' import { useActualites } from 'utils/actualitesContext' @@ -13,7 +12,7 @@ interface ActualitesModalProps { export default function ActualitesModal({ onClose }: ActualitesModalProps) { const modalRef = useRef(null) - const [actualites] = useActualites() + const actualites = useActualites() function formaterTexteAvecTag(texteAFormater: string) { const texteAssaini = sanitizeHtml(texteAFormater, { @@ -59,7 +58,7 @@ export default function ActualitesModal({ onClose }: ActualitesModalProps) {
- {formaterTexteAvecTag(actualites)} + {formaterTexteAvecTag(actualites?.contenu ?? '')}
diff --git a/components/NavLinks.tsx b/components/NavLinks.tsx index 958d69acb..f72f0e933 100644 --- a/components/NavLinks.tsx +++ b/components/NavLinks.tsx @@ -43,7 +43,7 @@ export default function NavLinks({ const pathname = usePathname() const [conseiller] = useConseiller() const [portefeuille] = usePortefeuille() - const [actualites] = useActualites() + const actualites = useActualites() const [afficherActualiteModal, setAfficherActualiteModal] = useState(false) @@ -209,7 +209,11 @@ export default function NavLinks({ onClick={ouvrirActualites} showLabelOnSmallScreen={showLabelsOnSmallScreen} badgeLabel={ - aDeNouvellesActualites(conseiller, actualites.modified) + actualites && + aDeNouvellesActualites( + conseiller, + actualites.dateDerniereModification + ) ? '!' : undefined } diff --git a/fixtures/actualites.ts b/fixtures/actualites.ts index 5ba9cf3e7..3b34accec 100644 --- a/fixtures/actualites.ts +++ b/fixtures/actualites.ts @@ -1,3 +1,9 @@ -export const uneActualite = () => { - return "

Nouveauté

http://www.google.com" +import { Actualites } from 'interfaces/actualites' + +export const uneActualite = (): Actualites => { + return { + contenu: + "

Nouveauté

http://www.google.com", + dateDerniereModification: '2024-10-30', + } } diff --git a/interfaces/actualites.ts b/interfaces/actualites.ts new file mode 100644 index 000000000..6873609e4 --- /dev/null +++ b/interfaces/actualites.ts @@ -0,0 +1,4 @@ +export type Actualites = { + contenu: string + dateDerniereModification: string +} diff --git a/services/actualites.service.ts b/services/actualites.service.ts index 0f14eeca6..414663323 100644 --- a/services/actualites.service.ts +++ b/services/actualites.service.ts @@ -1,12 +1,19 @@ +import { Actualites } from 'interfaces/actualites' import { fetchJson } from 'utils/httpClient' -export async function getActualites() { - const url = process.env.NEXT_PUBLIC_WORDPRESS_ACTUS_CEJ_LINK as string +export async function getActualites(): Promise { + const url = process.env.NEXT_PUBLIC_WORDPRESS_ACTUS_CEJ_LINK + if (!url) return null + const { content: { + modified, content: { rendered }, }, + }: { + content: { modified: string; content: { rendered: string } } + headers: Headers } = await fetchJson(url) - return rendered + return { contenu: rendered, dateDerniereModification: modified } } diff --git a/tests/renderWithContexts.tsx b/tests/renderWithContexts.tsx index a8dda6c56..34f9301b2 100644 --- a/tests/renderWithContexts.tsx +++ b/tests/renderWithContexts.tsx @@ -7,12 +7,12 @@ import { extractBaseBeneficiaire, } from 'fixtures/beneficiaire' import { unConseiller } from 'fixtures/conseiller' +import { Actualites } from 'interfaces/actualites' import { BaseBeneficiaire, BeneficiaireEtChat } from 'interfaces/beneficiaire' import { Conseiller } from 'interfaces/conseiller' import { AlerteParam } from 'referentiel/alerteParam' import { ActualitesProvider } from 'utils/actualitesContext' import { Alerte, AlerteProvider } from 'utils/alerteContext' -import { RenderedWPPageType } from 'utils/AppContextProviders' import { ChatCredentialsProvider } from 'utils/chat/chatCredentialsContext' import { ChatsProvider } from 'utils/chat/chatsContext' import { @@ -103,7 +103,7 @@ export default function renderWithContexts( } function provideContexts( - actualites: string, + actualites: Actualites, children: ReactNode, conseiller: Conseiller, portefeuille: Partial<{ @@ -134,7 +134,7 @@ function provideContexts( portefeuille={portefeuille.value ?? []} setterForTests={portefeuille.setter} > - + { it('renvoie les informations d’un conseiller', async () => { // Given const accessToken = 'accessToken' - const dateSignature = '2023-10-03T00:00:00.000+02:00' + const uneDate = '2023-10-03T00:00:00.000+02:00' - const user = { + const user: Session.HydratedUser = { id: 'id-user', name: 'Albert Durant', structure: StructureConseiller.MILO, @@ -34,7 +35,6 @@ describe('ConseillerApiService', () => { estConseiller: true, estSuperviseur: false, estSuperviseurResponsable: false, - dateSignatureCGU: dateSignature, } ;(apiGet as jest.Mock).mockResolvedValue({ content: unConseillerJson({ @@ -42,7 +42,8 @@ describe('ConseillerApiService', () => { nom: 'Milo Marseille', id: 'id-agence', }, - dateSignatureCGU: dateSignature, + dateSignatureCGU: uneDate, + dateVisionnageActus: uneDate, }), }) @@ -54,7 +55,8 @@ describe('ConseillerApiService', () => { expect(actual).toEqual( unConseiller({ agence: { nom: 'Milo Marseille', id: 'id-agence' }, - dateSignatureCGU: dateSignature, + dateSignatureCGU: uneDate, + dateVisionnageActus: uneDate, }) ) }) diff --git a/utils/AppContextProviders.tsx b/utils/AppContextProviders.tsx index b31a4e89c..202415fcc 100644 --- a/utils/AppContextProviders.tsx +++ b/utils/AppContextProviders.tsx @@ -21,19 +21,13 @@ import { ConseillerProvider } from 'utils/conseiller/conseillerContext' import { MobileViewportProvider } from 'utils/mobileViewportContext' import { PortefeuilleProvider } from 'utils/portefeuilleContext' -export type RenderedWPPageType = { - rendered: string -} - export default function AppContextProviders({ conseiller, portefeuille, - actualitesData, children, }: { conseiller: Conseiller portefeuille: BeneficiaireFromListe[] - actualitesData: string children: ReactNode }) { const portefeuilleTrie = portefeuille @@ -52,7 +46,7 @@ export default function AppContextProviders({ - + diff --git a/utils/actualitesContext.tsx b/utils/actualitesContext.tsx index 4834fd9b1..ac446a7d0 100644 --- a/utils/actualitesContext.tsx +++ b/utils/actualitesContext.tsx @@ -1,35 +1,48 @@ 'use client' -import { createContext, ReactNode, useContext, useState } from 'react' +import { + createContext, + ReactNode, + useContext, + useEffect, + useState, +} from 'react' -type ActualitesState = [string, (updatedActualites: string) => void] +import { Actualites } from 'interfaces/actualites' +import { getActualites } from 'services/actualites.service' -const ActualitesContext = createContext(undefined) +const ActualitesContext = createContext( + undefined +) export function ActualitesProvider({ children, - actualites, - setterForTests, + actualitesForTests, }: { children: ReactNode - actualites: string - setterForTests?: (updatedActualites: string) => void + actualitesForTests?: Actualites | null }) { - const [state, setActualites] = useState(actualites) - const setter = setterForTests ?? setActualites + const [actualites, setActualites] = useState( + actualitesForTests + ) + + useEffect(() => { + if (actualites === undefined) getActualites().then(setActualites) + return () => setActualites(undefined) + }, [actualites]) return ( - + {children} ) } -export function useActualites(): ActualitesState { - const actualitesContext = useContext(ActualitesContext) - if (!actualitesContext) { +export function useActualites(): Actualites | null { + const actualites = useContext(ActualitesContext) + if (actualites === undefined) { throw new Error('useActualites must be used within ActualitesProvider') } - return actualitesContext + return actualites } From aa0de08f27c259892e8893a9086091e31285cb87 Mon Sep 17 00:00:00 2001 From: Arthur L-Brjc Date: Thu, 31 Oct 2024 16:24:42 +0100 Subject: [PATCH 3/4] fix: context actualites --- services/actualites.service.ts | 4 ++-- utils/actualitesContext.tsx | 18 +++++------------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/services/actualites.service.ts b/services/actualites.service.ts index 414663323..dcf537881 100644 --- a/services/actualites.service.ts +++ b/services/actualites.service.ts @@ -1,9 +1,9 @@ import { Actualites } from 'interfaces/actualites' import { fetchJson } from 'utils/httpClient' -export async function getActualites(): Promise { +export async function getActualites(): Promise { const url = process.env.NEXT_PUBLIC_WORDPRESS_ACTUS_CEJ_LINK - if (!url) return null + if (!url) return const { content: { diff --git a/utils/actualitesContext.tsx b/utils/actualitesContext.tsx index ac446a7d0..33350b3df 100644 --- a/utils/actualitesContext.tsx +++ b/utils/actualitesContext.tsx @@ -11,24 +11,21 @@ import { import { Actualites } from 'interfaces/actualites' import { getActualites } from 'services/actualites.service' -const ActualitesContext = createContext( - undefined -) +const ActualitesContext = createContext(undefined) export function ActualitesProvider({ children, actualitesForTests, }: { children: ReactNode - actualitesForTests?: Actualites | null + actualitesForTests?: Actualites }) { - const [actualites, setActualites] = useState( + const [actualites, setActualites] = useState( actualitesForTests ) useEffect(() => { if (actualites === undefined) getActualites().then(setActualites) - return () => setActualites(undefined) }, [actualites]) return ( @@ -38,11 +35,6 @@ export function ActualitesProvider({ ) } -export function useActualites(): Actualites | null { - const actualites = useContext(ActualitesContext) - if (actualites === undefined) { - throw new Error('useActualites must be used within ActualitesProvider') - } - - return actualites +export function useActualites(): Actualites | undefined { + return useContext(ActualitesContext) } From bdaf165a4aff92e4acc89ddbdeee4c24dc67a47f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 6 Nov 2024 01:46:44 +0000 Subject: [PATCH 4/4] fix(deps): update nextjs monorepo to v14.2.17 --- package.json | 6 +-- yarn.lock | 122 +++++++++++++++++++++++++-------------------------- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/package.json b/package.json index 198c93d12..4f1b68f71 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "dependencies": { "@elastic/apm-rum": "5.16.1", "@elastic/apm-rum-react": "2.0.3", - "@next/bundle-analyzer": "14.2.16", + "@next/bundle-analyzer": "14.2.17", "crypto-js": "4.2.0", "dotenv": "16.4.5", "elastic-apm-node": "4.8.0", @@ -28,7 +28,7 @@ "lodash.isequal": "4.5.0", "luxon": "3.5.0", "matomo-tracker": "2.2.4", - "next": "14.2.16", + "next": "14.2.17", "next-auth": "4.24.9", "next-logger": "5.0.1", "next-themes": "0.3.0", @@ -58,7 +58,7 @@ "autoprefixer": "^10.4.20", "css-loader": "^7.1.2", "eslint": "^8.57.1", - "eslint-config-next": "14.2.16", + "eslint-config-next": "14.2.17", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jsx-a11y": "^6.10.1", "eslint-plugin-prettier": "^5.2.1", diff --git a/yarn.lock b/yarn.lock index 16210e8d2..03e2349e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2598,90 +2598,90 @@ __metadata: languageName: node linkType: hard -"@next/bundle-analyzer@npm:14.2.16": - version: 14.2.16 - resolution: "@next/bundle-analyzer@npm:14.2.16" +"@next/bundle-analyzer@npm:14.2.17": + version: 14.2.17 + resolution: "@next/bundle-analyzer@npm:14.2.17" dependencies: webpack-bundle-analyzer: "npm:4.10.1" - checksum: 10c0/101742a36345282fa80a36b68d695676e072ddb9ebd3f396799d36d2ce863de6a84193e5043bfa9a525256d876e7a58fc3eb16d497d98316e93e26402ff7f568 + checksum: 10c0/88103424b99945cf5d02afcd07d162f8c4cc7d46af48ab8b0833fe79b4a88140c4d0dfbd19979459bc7c70489707f0913adf298790c247cd9952bac6504920af languageName: node linkType: hard -"@next/env@npm:14.2.16": - version: 14.2.16 - resolution: "@next/env@npm:14.2.16" - checksum: 10c0/e9d795727bc43f171557a7a91111c9b71833840061275b5d4adf96f416febf4f02afb9dac1f4275f4a3e96a0a0db22b58fe934483e2823e76a5d3c60a563394b +"@next/env@npm:14.2.17": + version: 14.2.17 + resolution: "@next/env@npm:14.2.17" + checksum: 10c0/181998dfe06275a7f43c56847bfbc4c521a10bd0e4a223b5b0fa1f73c24b0a993daa7ee736b82cbc3a6b64b13d965f7452dd4fc47f0a99909a1aa150862f5b1e languageName: node linkType: hard -"@next/eslint-plugin-next@npm:14.2.16": - version: 14.2.16 - resolution: "@next/eslint-plugin-next@npm:14.2.16" +"@next/eslint-plugin-next@npm:14.2.17": + version: 14.2.17 + resolution: "@next/eslint-plugin-next@npm:14.2.17" dependencies: glob: "npm:10.3.10" - checksum: 10c0/b1744f580c1ff195ef7dd10fdf9270ff3759b12ec71dba1a3f7a84582077bc3bf2561c63d6b1d9cb91c49a5ebe403996565124d0dec9d16c7dce452cae4634af + checksum: 10c0/752bdb3d8330d8cb4e6504d066200475156001d292a7d39f4afc6bf9c53791637123829c0a8ebb30e13b94052c5be6978237b7c0321a641f653b46cfeec01942 languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:14.2.16": - version: 14.2.16 - resolution: "@next/swc-darwin-arm64@npm:14.2.16" +"@next/swc-darwin-arm64@npm:14.2.17": + version: 14.2.17 + resolution: "@next/swc-darwin-arm64@npm:14.2.17" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:14.2.16": - version: 14.2.16 - resolution: "@next/swc-darwin-x64@npm:14.2.16" +"@next/swc-darwin-x64@npm:14.2.17": + version: 14.2.17 + resolution: "@next/swc-darwin-x64@npm:14.2.17" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:14.2.16": - version: 14.2.16 - resolution: "@next/swc-linux-arm64-gnu@npm:14.2.16" +"@next/swc-linux-arm64-gnu@npm:14.2.17": + version: 14.2.17 + resolution: "@next/swc-linux-arm64-gnu@npm:14.2.17" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:14.2.16": - version: 14.2.16 - resolution: "@next/swc-linux-arm64-musl@npm:14.2.16" +"@next/swc-linux-arm64-musl@npm:14.2.17": + version: 14.2.17 + resolution: "@next/swc-linux-arm64-musl@npm:14.2.17" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:14.2.16": - version: 14.2.16 - resolution: "@next/swc-linux-x64-gnu@npm:14.2.16" +"@next/swc-linux-x64-gnu@npm:14.2.17": + version: 14.2.17 + resolution: "@next/swc-linux-x64-gnu@npm:14.2.17" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:14.2.16": - version: 14.2.16 - resolution: "@next/swc-linux-x64-musl@npm:14.2.16" +"@next/swc-linux-x64-musl@npm:14.2.17": + version: 14.2.17 + resolution: "@next/swc-linux-x64-musl@npm:14.2.17" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:14.2.16": - version: 14.2.16 - resolution: "@next/swc-win32-arm64-msvc@npm:14.2.16" +"@next/swc-win32-arm64-msvc@npm:14.2.17": + version: 14.2.17 + resolution: "@next/swc-win32-arm64-msvc@npm:14.2.17" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-ia32-msvc@npm:14.2.16": - version: 14.2.16 - resolution: "@next/swc-win32-ia32-msvc@npm:14.2.16" +"@next/swc-win32-ia32-msvc@npm:14.2.17": + version: 14.2.17 + resolution: "@next/swc-win32-ia32-msvc@npm:14.2.17" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:14.2.16": - version: 14.2.16 - resolution: "@next/swc-win32-x64-msvc@npm:14.2.16" +"@next/swc-win32-x64-msvc@npm:14.2.17": + version: 14.2.17 + resolution: "@next/swc-win32-x64-msvc@npm:14.2.17" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -5410,11 +5410,11 @@ __metadata: languageName: node linkType: hard -"eslint-config-next@npm:14.2.16": - version: 14.2.16 - resolution: "eslint-config-next@npm:14.2.16" +"eslint-config-next@npm:14.2.17": + version: 14.2.17 + resolution: "eslint-config-next@npm:14.2.17" dependencies: - "@next/eslint-plugin-next": "npm:14.2.16" + "@next/eslint-plugin-next": "npm:14.2.17" "@rushstack/eslint-patch": "npm:^1.3.3" "@typescript-eslint/eslint-plugin": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" "@typescript-eslint/parser": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" @@ -5430,7 +5430,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 10c0/2c2c15df8727692320be75ea2e0a24d1ab830948d6193f8daeb98fc726f79e98546ac5e52e26f13b0d78c316ae11af9f25fddf9e833b7dee2c37b7eae51cda44 + checksum: 10c0/aba04b75209b6433a865f23b7ac7f34792d799b4e1c81a043f18f7f3437e9db03d479fc6d42f00ecf32631e91251aa7cd97817459487ecafe9ac07551e93e44f languageName: node linkType: hard @@ -8462,20 +8462,20 @@ __metadata: languageName: node linkType: hard -"next@npm:14.2.16": - version: 14.2.16 - resolution: "next@npm:14.2.16" +"next@npm:14.2.17": + version: 14.2.17 + resolution: "next@npm:14.2.17" dependencies: - "@next/env": "npm:14.2.16" - "@next/swc-darwin-arm64": "npm:14.2.16" - "@next/swc-darwin-x64": "npm:14.2.16" - "@next/swc-linux-arm64-gnu": "npm:14.2.16" - "@next/swc-linux-arm64-musl": "npm:14.2.16" - "@next/swc-linux-x64-gnu": "npm:14.2.16" - "@next/swc-linux-x64-musl": "npm:14.2.16" - "@next/swc-win32-arm64-msvc": "npm:14.2.16" - "@next/swc-win32-ia32-msvc": "npm:14.2.16" - "@next/swc-win32-x64-msvc": "npm:14.2.16" + "@next/env": "npm:14.2.17" + "@next/swc-darwin-arm64": "npm:14.2.17" + "@next/swc-darwin-x64": "npm:14.2.17" + "@next/swc-linux-arm64-gnu": "npm:14.2.17" + "@next/swc-linux-arm64-musl": "npm:14.2.17" + "@next/swc-linux-x64-gnu": "npm:14.2.17" + "@next/swc-linux-x64-musl": "npm:14.2.17" + "@next/swc-win32-arm64-msvc": "npm:14.2.17" + "@next/swc-win32-ia32-msvc": "npm:14.2.17" + "@next/swc-win32-x64-msvc": "npm:14.2.17" "@swc/helpers": "npm:0.5.5" busboy: "npm:1.6.0" caniuse-lite: "npm:^1.0.30001579" @@ -8516,7 +8516,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10c0/8cd036a6f30d4cc8ab8480c19339ee6134ffd5b18338ff5a07de397ed4e29fad54de5219f70aafabf1fe9c48a7d54b7df58ba1f29cfa5d3351ff7763e8d4844e + checksum: 10c0/ee350c1de7709da9a240752ebb8f56e0a01bbeae43177a43a463dd1d4ed071c414899afb3ff2d4228e38afa4029f0e0f0b56d9939b0f4a1bf383f77f32ec5ad9 languageName: node linkType: hard @@ -8952,7 +8952,7 @@ __metadata: dependencies: "@elastic/apm-rum": "npm:5.16.1" "@elastic/apm-rum-react": "npm:2.0.3" - "@next/bundle-analyzer": "npm:14.2.16" + "@next/bundle-analyzer": "npm:14.2.17" "@svgr/webpack": "npm:8.1.0" "@testing-library/dom": "npm:^10.4.0" "@testing-library/jest-dom": "npm:^6.6.2" @@ -8973,7 +8973,7 @@ __metadata: dotenv: "npm:16.4.5" elastic-apm-node: "npm:4.8.0" eslint: "npm:^8.57.1" - eslint-config-next: "npm:14.2.16" + eslint-config-next: "npm:14.2.17" eslint-config-prettier: "npm:^9.1.0" eslint-plugin-jsx-a11y: "npm:^6.10.1" eslint-plugin-prettier: "npm:^5.2.1" @@ -8986,7 +8986,7 @@ __metadata: lodash.isequal: "npm:4.5.0" luxon: "npm:3.5.0" matomo-tracker: "npm:2.2.4" - next: "npm:14.2.16" + next: "npm:14.2.17" next-auth: "npm:4.24.9" next-logger: "npm:5.0.1" next-themes: "npm:0.3.0"