|
1 | | -import React from 'react' |
| 1 | +import React from 'react'; |
2 | 2 |
|
3 | 3 | export default class AppItem extends React.Component { |
| 4 | + render() { |
| 5 | + const {checked, onToggle, name, title, description, t, ns} = this.props; |
| 6 | + const required = this.props.required || false; |
| 7 | + const optOut = this.props.optOut || false; |
| 8 | + const purposes = this.props.purposes || []; |
| 9 | + const onChange = (e) => { |
| 10 | + onToggle(e.target.checked); |
| 11 | + }; |
| 12 | + const id = `orejime-app-item-${name}`; |
| 13 | + const isChecked = checked || required; |
| 14 | + const purposesText = purposes |
| 15 | + .map((purpose) => t(['purposes', purpose])) |
| 16 | + .join(', '); |
| 17 | + const optOutText = optOut ? ( |
| 18 | + <span |
| 19 | + className={ns('AppItem-optOut')} |
| 20 | + title={t(['app', 'optOut', 'description'])} |
| 21 | + > |
| 22 | + {t(['app', 'optOut', 'title'])} |
| 23 | + </span> |
| 24 | + ) : ( |
| 25 | + '' |
| 26 | + ); |
| 27 | + const requiredText = required ? ( |
| 28 | + <span |
| 29 | + className={ns('AppItem-required')} |
| 30 | + title={t(['app', 'required', 'description'])} |
| 31 | + > |
| 32 | + {t(['app', 'required', 'title'])} |
| 33 | + </span> |
| 34 | + ) : ( |
| 35 | + '' |
| 36 | + ); |
4 | 37 |
|
5 | | - render(){ |
6 | | - const {checked, onToggle, name, title, description, t, ns} = this.props |
7 | | - const required = this.props.required || false |
8 | | - const optOut = this.props.optOut || false |
9 | | - const purposes = this.props.purposes || [] |
10 | | - const onChange = (e) => { |
11 | | - onToggle(e.target.checked) |
12 | | - } |
13 | | - const id = `orejime-app-item-${name}` |
14 | | - const isChecked = checked || required |
15 | | - const purposesText = purposes.map((purpose) => t(['purposes', purpose])).join(", ") |
16 | | - const optOutText = optOut |
17 | | - ? <span |
18 | | - className={ns('AppItem-optOut')} |
19 | | - title={t(['app', 'optOut', 'description'])} |
20 | | - > |
21 | | - {t(['app', 'optOut', 'title'])} |
22 | | - </span> |
23 | | - : '' |
24 | | - const requiredText = required |
25 | | - ? <span |
26 | | - className={ns('AppItem-required')} |
27 | | - title={t(['app', 'required', 'description'])} |
28 | | - > |
29 | | - {t(['app', 'required', 'title'])} |
30 | | - </span> |
31 | | - : '' |
32 | | - |
33 | | - const purposesEl = purposes.length > 0 |
34 | | - ? <p className={ns('AppItem-purposes')}> |
35 | | - {t(['app', purposes.length > 1 ? 'purposes' : 'purpose'])}: {purposesText} |
36 | | - </p> |
37 | | - : null |
38 | | - const switchLabel = isChecked ? 'enabled' : 'disabled' |
39 | | - return <div className={ns('AppItem')}> |
40 | | - <input |
41 | | - id={id} |
42 | | - className={ns('AppItem-input')} |
43 | | - aria-describedby={`${id}-description`} |
44 | | - disabled={required} |
45 | | - checked={isChecked} |
46 | | - type="checkbox" |
47 | | - onChange={onChange} |
48 | | - /> |
49 | | - <label |
50 | | - htmlFor={id} |
51 | | - className={ns('AppItem-label')} |
52 | | - {...(required ? {tabIndex: "0"} : {})} |
53 | | - > |
54 | | - <span className={ns('AppItem-title')}>{t([name, 'title']) || title}</span>{requiredText}{optOutText} |
55 | | - <span className={ns(`AppItem-switch ${required ? 'AppItem-switch--disabled' : ''}`)}> |
56 | | - <div className={ns('AppItem-slider')}></div> |
57 | | - <div aria-hidden="true" className={ns('AppItem-switchLabel')}>{t(switchLabel)}</div> |
58 | | - </span> |
59 | | - </label> |
60 | | - <div id={`${id}-description`} className={ns('AppItem-fullDescription')}> |
61 | | - <p |
62 | | - className={ns('AppItem-description')} |
63 | | - dangerouslySetInnerHTML={{ |
64 | | - __html: t([name, 'description']) || description |
65 | | - }} |
66 | | - /> |
67 | | - {purposesEl} |
68 | | - </div> |
69 | | - </div> |
70 | | - } |
71 | | - |
| 38 | + const purposesEl = |
| 39 | + purposes.length > 0 ? ( |
| 40 | + <p className={ns('AppItem-purposes')}> |
| 41 | + {t(['app', purposes.length > 1 ? 'purposes' : 'purpose'])}:{' '} |
| 42 | + {purposesText} |
| 43 | + </p> |
| 44 | + ) : null; |
| 45 | + const switchLabel = isChecked ? 'enabled' : 'disabled'; |
| 46 | + return ( |
| 47 | + <div className={ns('AppItem')}> |
| 48 | + <input |
| 49 | + id={id} |
| 50 | + className={ns('AppItem-input')} |
| 51 | + aria-describedby={`${id}-description`} |
| 52 | + disabled={required} |
| 53 | + checked={isChecked} |
| 54 | + type="checkbox" |
| 55 | + onChange={onChange} |
| 56 | + /> |
| 57 | + <label |
| 58 | + htmlFor={id} |
| 59 | + className={ns('AppItem-label')} |
| 60 | + {...(required ? {tabIndex: '0'} : {})} |
| 61 | + > |
| 62 | + <span className={ns('AppItem-title')}> |
| 63 | + {t([name, 'title']) || title} |
| 64 | + </span> |
| 65 | + {requiredText} |
| 66 | + {optOutText} |
| 67 | + <span |
| 68 | + className={ns( |
| 69 | + `AppItem-switch ${ |
| 70 | + required ? 'AppItem-switch--disabled' : '' |
| 71 | + }` |
| 72 | + )} |
| 73 | + > |
| 74 | + <div className={ns('AppItem-slider')}></div> |
| 75 | + <div aria-hidden="true" className={ns('AppItem-switchLabel')}> |
| 76 | + {t(switchLabel)} |
| 77 | + </div> |
| 78 | + </span> |
| 79 | + </label> |
| 80 | + <div |
| 81 | + id={`${id}-description`} |
| 82 | + className={ns('AppItem-fullDescription')} |
| 83 | + > |
| 84 | + <p |
| 85 | + className={ns('AppItem-description')} |
| 86 | + dangerouslySetInnerHTML={{ |
| 87 | + __html: t([name, 'description']) || description |
| 88 | + }} |
| 89 | + /> |
| 90 | + {purposesEl} |
| 91 | + </div> |
| 92 | + </div> |
| 93 | + ); |
| 94 | + } |
72 | 95 | } |
0 commit comments