UNPKG

klaro

Version:

A simple but powerful consent manager.

133 lines (120 loc) 4.74 kB
import React from 'react'; import PurposeItem from './purpose-item'; export default class Purposes 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 purposes = {}; for (const service of services) { for (const purpose of service.purposes) { if (purposes[purpose] === undefined) purposes[purpose] = []; purposes[purpose].push(service); } } const toggle = (purposeKeys, value) => { purposeKeys.map((purpose) => { const purposeServices = purposes[purpose]; for (const service of purposeServices) { if (!service.required) { manager.updateConsent(service.name, value); } } }); }; const toggleAll = (value) => { toggle(Object.keys(purposes), value); }; const checkServices = (services) => { const status = { allEnabled: true, onlyRequiredEnabled: true, allDisabled: true, allRequired: true, }; for (const service of services) { if (!service.required) status.allRequired = false; if (consents[service.name]) { if (!service.required) status.onlyRequiredEnabled = false; status.allDisabled = false; } else if (!service.required) status.allEnabled = false; } if (status.allDisabled) status.onlyRequiredEnabled = false; return status; }; const purposeOrder = config.purposeOrder || [] const purposeItems = Object.keys(purposes).sort((a,b) => purposeOrder.indexOf(a)-purposeOrder.indexOf(b)).map((purpose) => { const togglePurpose = (value) => { toggle([purpose], value); }; const status = checkServices(purposes[purpose]); return ( <li key={purpose} className="cm-purpose"> <PurposeItem allEnabled={status.allEnabled} allDisabled={status.allDisabled} onlyRequiredEnabled={status.onlyRequiredEnabled} required={status.allRequired} consents={consents} name={purpose} config={config} lang={lang} manager={manager} onToggle={togglePurpose} services={purposes[purpose]} t={t} /> </li> ); }); const togglablePurposes = Object.keys(purposes).filter((purpose) => { for (const service of purposes[purpose]) { if (!service.required) return true; } return false; }); const status = checkServices(services); return ( <ul className="cm-purposes"> {purposeItems} {togglablePurposes.length > 1 && ( <li className="cm-purpose cm-toggle-all"> <PurposeItem name="disableAll" title={t(['service', 'disableAll', 'title'])} description={t([ 'service', 'disableAll', 'description', ])} allDisabled={status.allDisabled} allEnabled={status.allEnabled} onlyRequiredEnabled={status.onlyRequiredEnabled} onToggle={toggleAll} manager={manager} consents={consents} config={config} lang={lang} services={[]} t={t} /> </li> )} </ul> ); } }