UNPKG

klaro

Version:

A simple but powerful consent manager.

123 lines (108 loc) 3.55 kB
import React from 'react'; import ServiceItem from './service-item'; export const ServiceItems = ({ services, config, consents, lang, toggle, visible, t, }) => { return services.map((service) => { const toggleService = (value) => { toggle([service], value); }; const checked = consents[service.name]; return ( <li key={service.name} className="cm-service"> <ServiceItem checked={checked || service.required} onToggle={toggleService} config={config} lang={lang} visible={visible} t={t} {...service} /> </li> ); }); }; export default class Services extends React.Component { constructor(props) { super(props); props.manager.watch(this); this.state = { consents: props.manager.consents, }; } componentWillUnmount() { this.props.manager.unwatch(this); } update(obj, type, data) { if (obj === this.props.manager && type === 'consents') this.setState({ consents: data }); } render() { const { config, t, manager, lang } = this.props; const { consents } = this.state; const { services } = config; const toggle = (services, value) => { services.map((service) => { if (!service.required) { manager.updateConsent(service.name, value); } }); }; const toggleAll = (value) => { toggle(services, value); }; const serviceItems = ( <ServiceItems config={config} lang={lang} services={services} t={t} consents={consents} toggle={toggle} /> ); const togglableServices = services.filter( (service) => !service.required ); const nEnabled = togglableServices.filter( (service) => consents[service.name] ).length; const nRequired = services.filter((service) => service.required).length; const allEnabled = nEnabled === togglableServices.length; const allDisabled = nEnabled === 0; const onlyRequiredEnabled = services.filter((service) => service.required).length > 0 && allDisabled; return ( <ul className="cm-services"> {serviceItems} {!config.hideToggleAll && togglableServices.length > 1 && ( <li className="cm-service cm-toggle-all"> <ServiceItem name="disableAll" title={t(['service', 'disableAll', 'title'])} description={t([ 'service', 'disableAll', 'description', ])} checked={allEnabled} config={config} onlyRequiredEnabled={!allEnabled && nRequired > 0} onToggle={toggleAll} lang={lang} t={t} /> </li> )} </ul> ); } }