UNPKG

10.2 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _stringify = require("babel-runtime/core-js/json/stringify");
8
9var _stringify2 = _interopRequireDefault(_stringify);
10
11var _extends2 = require("babel-runtime/helpers/extends");
12
13var _extends3 = _interopRequireDefault(_extends2);
14
15var _objectWithoutProperties2 = require("babel-runtime/helpers/objectWithoutProperties");
16
17var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
18
19var _slicedToArray2 = require("babel-runtime/helpers/slicedToArray");
20
21var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
22
23var _toConsumableArray2 = require("babel-runtime/helpers/toConsumableArray");
24
25var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
26
27var _react = require("react");
28
29var _react2 = _interopRequireDefault(_react);
30
31var _styledComponents = require("styled-components");
32
33var _CheckboxV = require("./CheckboxV2");
34
35var _CheckboxV2 = _interopRequireDefault(_CheckboxV);
36
37var _RadioButton = require("./RadioButton");
38
39var _RadioButton2 = _interopRequireDefault(_RadioButton);
40
41var _StyledMultipleChoice = require("./StyledMultipleChoice");
42
43var _helperFunctions = require("./helperFunctions");
44
45var _ = require(".");
46
47function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
48
49var defaultRenderCurrentOption = function defaultRenderCurrentOption(_ref) {
50 var label = _ref.label;
51
52 if (typeof label === "string") {
53 return label;
54 } else {
55 var flattened = (0, _helperFunctions.flatten)(label);
56 return flattened.join(", ");
57 }
58};
59
60var MultipleChoice = function MultipleChoice(props) {
61 var _props$buttonType = props.buttonType,
62 buttonType = _props$buttonType === undefined ? "checkbox" : _props$buttonType,
63 _props$renderIconMedi = props.renderIconMediaMin,
64 renderIconMediaMin = _props$renderIconMedi === undefined ? 0 : _props$renderIconMedi,
65 _props$alwaysOn = props.alwaysOn,
66 alwaysOn = _props$alwaysOn === undefined ? false : _props$alwaysOn,
67 _props$mutuallyExclus = props.mutuallyExclusive,
68 mutuallyExclusive = _props$mutuallyExclus === undefined ? false : _props$mutuallyExclus,
69 _props$iconSize = props.iconSize,
70 iconSize = _props$iconSize === undefined ? 4 : _props$iconSize,
71 footnote = props.footnote,
72 options = props.options,
73 _props$onChange = props.onChange,
74 onChange = _props$onChange === undefined ? function (x) {
75 return null;
76 } : _props$onChange,
77 _props$renderCurrentO = props.renderCurrentOption,
78 renderCurrentOption = _props$renderCurrentO === undefined ? defaultRenderCurrentOption : _props$renderCurrentO,
79 _props$sortingFunctio = props.sortingFunction,
80 sortingFunction = _props$sortingFunctio === undefined ? function () {
81 return 0;
82 } : _props$sortingFunctio,
83 _props$initialOptions = props.initialOptions,
84 initialOptions = _props$initialOptions === undefined ? [] : _props$initialOptions,
85 error = props.error;
86
87
88 function init(initialOptions) {
89 return { currentOptions: initialOptions };
90 }
91
92 var reducer = function reducer(_ref2, action) {
93 var currentOptions = _ref2.currentOptions;
94
95 var updatedState = {};
96 switch (action.type) {
97 case "add":
98 if (sortingFunction) {
99 updatedState = {
100 currentOptions: [].concat((0, _toConsumableArray3.default)(currentOptions), [action.payload.option]).sort(sortingFunction)
101 };
102 } else {
103 updatedState = {
104 currentOptions: [].concat((0, _toConsumableArray3.default)(currentOptions), [action.payload.option])
105 };
106 }
107 break;
108 case "remove":
109 updatedState = {
110 currentOptions: currentOptions.filter(function (currentOption) {
111 return currentOption.value !== action.payload.option.value;
112 })
113 };
114 break;
115 case "clear":
116 updatedState = init(action.payload.options);
117 break;
118 default:
119 throw new Error();
120 }
121 onChange(updatedState.currentOptions);
122 return updatedState;
123 };
124
125 var _useReducer = (0, _react.useReducer)(reducer, initialOptions, init),
126 _useReducer2 = (0, _slicedToArray3.default)(_useReducer, 2),
127 currentOptions = _useReducer2[0].currentOptions,
128 dispatch = _useReducer2[1];
129
130 var isActive = function isActive(option) {
131 return currentOptions.some(function (currentOption) {
132 return currentOption.value === option.value;
133 });
134 };
135
136 var getChildProps = function getChildProps() {
137 var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
138
139 var className = _ref3.className,
140 style = _ref3.style,
141 _onClick = _ref3.onClick,
142 option = _ref3.option,
143 props = (0, _objectWithoutProperties3.default)(_ref3, ["className", "style", "onClick", "option"]);
144
145 var optionIsActive = isActive(option);
146 var handleClassName = (0, _helperFunctions.advancedMulti)({
147 unflattenedBases: [className, "multiplechoice__option"],
148 flipVars: [[optionIsActive, "active", "inactive"]]
149 });
150 return (0, _extends3.default)({
151 onClick: function onClick(e) {
152 for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
153 args[_key - 1] = arguments[_key];
154 }
155
156 e.stopPropagation();
157 e.nativeEvent.stopImmediatePropagation();
158 if (isActive(option)) {
159 if (!alwaysOn) {
160 dispatch({ type: "remove", payload: { option: option } });
161 }
162 } else {
163 if (!mutuallyExclusive) {
164 dispatch({ type: "add", payload: { option: option } });
165 } else {
166 dispatch({ type: "clear", payload: { options: [] } });
167 dispatch({ type: "add", payload: { option: option } });
168 }
169 }
170 _onClick && _onClick.apply(undefined, [e].concat(args));
171 },
172 className: handleClassName,
173 style: style
174 }, props);
175 };
176 // const themeContext = useContext(ThemeContext)
177 // console.log(themeContext)
178 return _react2.default.createElement(
179 _StyledMultipleChoice.CONTAINER,
180 null,
181 (0, _stringify2.default)(props.currentOptions),
182 options.map(function (option) {
183 var checkboxProps = {
184 disabled: true,
185 className: "input",
186 id: option.value,
187 checked: isActive(option),
188 onChange: function onChange(e) {}
189 };
190 var triggerProps = (0, _extends3.default)({
191 padding: buttonType === "checkbox" ? "0 2.4rem 0" : "0.75rem 2.5rem",
192 margin: buttonType === "checkbox" ? "0 -2.4rem 0" : "0 -2.5rem 0",
193
194 isOn: isActive(option),
195 buttonType: buttonType
196 }, getChildProps({ option: option }));
197 return _react2.default.createElement(
198 _StyledMultipleChoice.OPTION,
199 {
200 key: option.value,
201 style: {
202 margin: buttonType !== "checkbox" ? "" : "0 0 0.75rem 0"
203 }
204 },
205 typeof option.label === "string" ? buttonType === "checkbox" ? _react2.default.createElement(
206 _StyledMultipleChoice.CHECKBOX_TRIGGER,
207 (0, _extends3.default)({}, triggerProps),
208 _react2.default.createElement(
209 _StyledMultipleChoice.CHECKBOX_CONTAINER,
210 null,
211 _react2.default.createElement(_CheckboxV2.default, (0, _extends3.default)({}, checkboxProps))
212 ),
213 _react2.default.createElement(
214 _StyledMultipleChoice.LABEL,
215 null,
216 option.label
217 )
218 ) : _react2.default.createElement(
219 _StyledMultipleChoice.RADIO_TRIGGER,
220 (0, _extends3.default)({}, triggerProps),
221 _react2.default.createElement(
222 _StyledMultipleChoice.CHECKBOX_CONTAINER,
223 null,
224 _react2.default.createElement(_RadioButton2.default, (0, _extends3.default)({}, checkboxProps))
225 ),
226 _react2.default.createElement(
227 _StyledMultipleChoice.LABEL,
228 null,
229 option.label
230 )
231 ) : _react2.default.createElement(
232 _StyledMultipleChoice.CHECKBOX_TRIGGER,
233 (0, _extends3.default)({}, triggerProps),
234 _react2.default.createElement(
235 _StyledMultipleChoice.CHECKBOX_CONTAINER,
236 null,
237 buttonType === "checkbox" ? _react2.default.createElement(_CheckboxV2.default, (0, _extends3.default)({}, checkboxProps)) : _react2.default.createElement(_RadioButton2.default, (0, _extends3.default)({}, checkboxProps))
238 ),
239 _react2.default.createElement(
240 _StyledMultipleChoice.LABEL,
241 null,
242 option.label.map(function (row, i) {
243 return _react2.default.createElement(
244 _StyledMultipleChoice.ROW,
245 { iconSize: iconSize, key: i, isOn: isActive(option) },
246 row.map(function (sublabel, j) {
247 var renderFootnote = function renderFootnote() {
248 if (footnote && footnote[0][0] === i && footnote[0][1] === j) {
249 return _react2.default.createElement(
250 _StyledMultipleChoice.FOOTNOTE_SIGN,
251 null,
252 footnote[1]
253 );
254 }
255 };
256 return _react2.default.createElement(
257 _StyledMultipleChoice.SUBLABEL,
258 { key: j },
259 typeof sublabel === "string" ? sublabel : sublabel(),
260 renderFootnote()
261 );
262 })
263 );
264 })
265 )
266 ),
267 option.subcontent && _react2.default.createElement(
268 _.RTGTransition,
269 { in: isActive(option), transitionType: "dropdown" },
270 function (_ref4) {
271 var style = _ref4.style;
272 return _react2.default.createElement(
273 _StyledMultipleChoice.CONTENT,
274 { style: style },
275 option.subcontent()
276 );
277 }
278 )
279 );
280 })
281 );
282};
283
284exports.default = MultipleChoice;
\No newline at end of file