BjConsent
Bannière de consentement cookies React avec modale de personnalisation en portail. Les services obligatoires restent acceptés après refus global ; onCustomize reçoit la liste des ids acceptés après enregistrement.
Utilisation
import { BjConsent } from '@flrxnt/dsbj/react'
const services = [
{ id: 'analytics', name: 'Mesure d’audience', description: 'Statistiques anonymes.' },
{ id: 'required', name: 'Indispensable', required: true },
]
export function Example() {
return (
<BjConsent
title="Gestion des cookies"
text="Nous utilisons des cookies pour améliorer le site."
services={services}
onAccept={() => {
localStorage.setItem('consent', 'all')
}}
onRefuse={() => {
localStorage.setItem('consent', 'essential')
}}
onCustomize={(accepted) => {
localStorage.setItem('consent', JSON.stringify(accepted))
}}
/>
)
}Callbacks : onAccept, onRefuse, onCustomize
import { useCallback } from 'react'
import { BjConsent } from '@flrxnt/dsbj/react'
type Service = { id: string; name: string; description?: string; required?: boolean }
export function ConsentTracked({ services }: { services: Service[] }) {
const onAccept = useCallback(() => {
console.log('accept all')
}, [])
const onRefuse = useCallback(() => {
console.log('refuse all')
}, [])
const onCustomize = useCallback((accepted: string[]) => {
console.log('saved ids', accepted)
}, [])
return (
<BjConsent
services={services}
onAccept={onAccept}
onRefuse={onRefuse}
onCustomize={onCustomize}
/>
)
}services : obligatoires et optionnels
const services = [
{ id: 'req', name: 'Sécurité', required: true, description: 'Toujours actif.' },
{ id: 'ads', name: 'Publicité', description: 'Optionnel.' },
]Enfants : contenu additionnel sous le texte
import { BjConsent } from '@flrxnt/dsbj/react'
export function ConsentWithSlot() {
return (
<BjConsent title="Cookies" text="Description courte.">
<p className="bj-text-sm">
<a href="/politique">Politique de confidentialité</a>
</p>
</BjConsent>
)
}Combinaison : titre, texte, services et callbacks
import { BjConsent } from '@flrxnt/dsbj/react'
export function ConsentFull() {
const services = [
{ id: 'necessary', name: 'Nécessaires', required: true },
{ id: 'stats', name: 'Statistiques' },
]
return (
<BjConsent
title="Vos choix"
text="Personnalisez les catégories ci-dessous ou via le bouton Personnaliser."
services={services}
className="my-consent"
role="dialog"
onAccept={() => {
/* … */
}}
onRefuse={() => {
/* … */
}}
onCustomize={(accepted) => {
/* persister accepted (string[]) */
}}
>
<p className="bj-text-sm">Texte additionnel.</p>
</BjConsent>
)
}Aperçu HTML — gestionnaire (portail en runtime)
Aperçu
Props
| Prop | Description |
|---|---|
title | Titre de la bannière ; valeur par défaut fournie par le composant. |
text | Texte explicatif sous le titre ; valeur par défaut fournie. |
services | Liste de services avec id, name, description et required optionnels. |
onAccept | Callback sans argument après « Tout accepter ». |
onRefuse | Callback sans argument après « Tout refuser ». |
onCustomize | Callback avec un tableau d’ids acceptés après « Enregistrer » dans la modale. |
children | Contenu optionnel rendu dans le corps de la bannière sous le texte. |
(div props) | Attributs div natifs supplémentaires sont appliqués à la bannière. |