UNPKG

18.7 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
7var slicedToArray = require('./slicedToArray-0711941d.js');
8require('./unsupportedIterableToArray-68db1d3b.js');
9var React = require('react');
10var React__default = _interopDefault(React);
11require('./_commonjsHelpers-72d386ba.js');
12var index = require('./index-b0606964.js');
13require('./defineProperty-0921a47c.js');
14require('./toConsumableArray-d8a4a2c3.js');
15var _styled = require('styled-components');
16var _styled__default = _interopDefault(_styled);
17require('./getPrototypeOf-2a661a20.js');
18require('./color.js');
19require('./components.js');
20require('./contains-component.js');
21var css = require('./css.js');
22require('./dayjs.min-e07657bf.js');
23require('./date.js');
24require('./miscellaneous.js');
25var environment = require('./environment.js');
26require('./font.js');
27require('./math-f4029164.js');
28require('./characters.js');
29require('./format.js');
30require('./keycodes.js');
31require('./url.js');
32require('./web3.js');
33var constants = require('./constants.js');
34require('./breakpoints.js');
35require('./springs.js');
36var textStyles = require('./text-styles.js');
37require('./theme-dark.js');
38require('./theme-light.js');
39var Theme = require('./Theme.js');
40var _extends$1 = require('./extends-40571110.js');
41var objectWithoutProperties = require('./objectWithoutProperties-35db8ab0.js');
42var index$1 = require('./index-ecc57c9f.js');
43require('./isObject-ec755c87.js');
44var Viewport = require('./Viewport-15101437.js');
45require('./FocusVisible.js');
46var ButtonBase = require('./ButtonBase.js');
47require('./IconPropTypes-56de5759.js');
48require('./IconAddUser.js');
49require('./IconAlert.js');
50require('./IconAlignCenter.js');
51require('./IconAlignJustify.js');
52require('./IconAlignLeft.js');
53require('./IconAlignRight.js');
54require('./IconAragon.js');
55require('./IconArrowDown.js');
56require('./IconArrowLeft.js');
57require('./IconArrowRight.js');
58require('./IconArrowUp.js');
59require('./IconAtSign.js');
60require('./IconBlock.js');
61require('./IconBookmark.js');
62require('./IconCalendar.js');
63require('./IconCanvas.js');
64require('./IconCaution.js');
65require('./IconCenter.js');
66require('./IconChart.js');
67require('./IconChat.js');
68require('./IconCheck.js');
69require('./IconChip.js');
70require('./IconCircleCheck.js');
71require('./IconCircleMinus.js');
72require('./IconCirclePlus.js');
73require('./IconClock.js');
74require('./IconCloudDownload.js');
75require('./IconCloudUpload.js');
76require('./IconCoin.js');
77require('./IconConfiguration.js');
78require('./IconConnect.js');
79require('./IconConnection.js');
80require('./IconConsole.js');
81require('./IconCopy.js');
82require('./IconCross.js');
83require('./IconDashedSquare.js');
84var IconDown = require('./IconDown.js');
85require('./IconDownload.js');
86require('./IconEdit.js');
87require('./IconEllipsis.js');
88require('./IconEnter.js');
89require('./IconEthereum.js');
90require('./IconExternal.js');
91require('./IconFile.js');
92require('./IconFilter.js');
93require('./IconFlag.js');
94require('./IconFolder.js');
95require('./IconGraph2.js');
96require('./IconGraph.js');
97require('./IconGrid.js');
98require('./IconGroup.js');
99require('./IconHash.js');
100require('./IconHeart.js');
101require('./IconHide.js');
102require('./IconHome.js');
103require('./IconImage.js');
104require('./IconInfo.js');
105require('./IconLabel.js');
106require('./IconLayers.js');
107require('./IconLeft.js');
108require('./IconLink.js');
109require('./IconLocation.js');
110require('./IconLock.js');
111require('./IconMail.js');
112require('./IconMaximize.js');
113require('./IconMenu.js');
114require('./IconMinimize.js');
115require('./IconMinus.js');
116require('./IconMove.js');
117require('./IconNoPicture.js');
118require('./IconPicture.js');
119require('./IconPlus.js');
120require('./IconPower.js');
121require('./IconPrint.js');
122require('./IconProhibited.js');
123require('./IconQuestion.js');
124require('./IconRefresh.js');
125require('./IconRemoveUser.js');
126require('./IconRight.js');
127require('./IconRotateLeft.js');
128require('./IconRotateRight.js');
129require('./IconSearch.js');
130require('./IconSettings.js');
131require('./IconShare.js');
132require('./IconSquareMinus.js');
133require('./IconSquarePlus.js');
134require('./IconSquare.js');
135require('./IconStarFilled.js');
136require('./IconStar.js');
137require('./IconSwap.js');
138require('./IconTarget.js');
139require('./IconToken.js');
140require('./IconTrash.js');
141require('./IconUnlock.js');
142require('./IconUp.js');
143require('./IconUpload.js');
144require('./IconUser.js');
145require('./IconView.js');
146require('./IconVote.js');
147require('./IconWallet.js');
148require('./IconWarning.js');
149require('./IconWorld.js');
150require('./IconWrite.js');
151require('./IconZoomIn.js');
152require('./IconZoomOut.js');
153require('./objectWithoutPropertiesLoose-1af20ad0.js');
154require('react-dom');
155require('./web-d0294535.js');
156require('./getDisplayName-7ab6d318.js');
157require('./index-bc84a358.js');
158require('./index-0db71dc1.js');
159require('./RootPortal.js');
160require('./proptypes-5b34673d.js');
161var Popover = require('./Popover.js');
162require('./observe.js');
163require('./index-030bfca8.js');
164require('./providers.js');
165
166var MIN_WIDTH = 128;
167
168function useDropDown(_ref) {
169 var buttonRef = _ref.buttonRef,
170 items = _ref.items,
171 displayedLabel = _ref.displayedLabel,
172 onChange = _ref.onChange,
173 placeholder = _ref.placeholder,
174 selected = _ref.selected;
175
176 var _useState = React.useState(displayedLabel),
177 _useState2 = slicedToArray._slicedToArray(_useState, 2),
178 selectedLabel = _useState2[0],
179 setSelectedLabel = _useState2[1];
180
181 var _useState3 = React.useState(false),
182 _useState4 = slicedToArray._slicedToArray(_useState3, 2),
183 opened = _useState4[0],
184 setOpened = _useState4[1];
185
186 var close = React.useCallback(function () {
187 setOpened(false);
188
189 if (buttonRef.current) {
190 buttonRef.current.focus();
191 }
192 }, [buttonRef]);
193 var toggle = React.useCallback(function () {
194 return setOpened(function (opened) {
195 return !opened;
196 });
197 }, []);
198 var handleItemSelect = React.useCallback(function (index) {
199 onChange(index);
200 close();
201 }, [onChange, close]);
202 React.useEffect(function () {
203 if (selected === -1 || !items[selected]) {
204 if (displayedLabel) {
205 setSelectedLabel(displayedLabel);
206 }
207
208 return;
209 }
210
211 setSelectedLabel(items[selected]);
212 }, [items, selected, displayedLabel]);
213 return {
214 handleItemSelect: handleItemSelect,
215 close: close,
216 toggle: toggle,
217 opened: opened,
218 selectedLabel: selectedLabel
219 };
220}
221
222function useButtonRef(cb) {
223 var buttonRef = React.useRef(null);
224 var refCallback = React.useCallback(function (el) {
225 if (el) {
226 cb(el);
227 }
228
229 buttonRef.current = el;
230 }, [cb]);
231 return {
232 buttonRef: buttonRef,
233 refCallback: refCallback
234 };
235}
236
237var _StyledButtonBase = _styled__default(ButtonBase.default).withConfig({
238 displayName: "DropDown___StyledButtonBase",
239 componentId: "sc-17zpefi-0"
240})(["display:", ";justify-content:space-between;align-items:center;height:", "px;padding-left:", "px;padding-right:", "px;width:", ";min-width:", ";background:", ";color:", ";border:", "px solid ", ";", ";", ""], function (p) {
241 return p._css;
242}, function (p) {
243 return p._css2;
244}, function (p) {
245 return p._css3;
246}, function (p) {
247 return p._css4;
248}, function (p) {
249 return p._css5;
250}, function (p) {
251 return p._css6;
252}, function (p) {
253 return p._css7;
254}, function (p) {
255 return p._css8;
256}, function (p) {
257 return p._css9;
258}, function (p) {
259 return p._css10;
260}, function (p) {
261 return p._css11;
262}, function (p) {
263 return p._css12;
264});
265
266var _StyledDiv = _styled__default("div").withConfig({
267 displayName: "DropDown___StyledDiv",
268 componentId: "sc-17zpefi-1"
269})(["overflow:hidden;"]);
270
271var _StyledIconDown = _styled__default(IconDown.default).withConfig({
272 displayName: "DropDown___StyledIconDown",
273 componentId: "sc-17zpefi-2"
274})(["margin-left:", "px;color:", ";"], function (p) {
275 return p._css13;
276}, function (p) {
277 return p._css14;
278});
279
280var _StyledDiv2 = _styled__default("div").withConfig({
281 displayName: "DropDown___StyledDiv2",
282 componentId: "sc-17zpefi-3"
283})(["position:absolute;top:-100vh;left:-100vw;opacity:0;visibility:hidden;"]);
284
285var DropDown = React__default.memo(function DropDown(_ref2) {
286 var disabled = _ref2.disabled,
287 header = _ref2.header,
288 items = _ref2.items,
289 onChange = _ref2.onChange,
290 placeholder = _ref2.placeholder,
291 renderLabel = _ref2.renderLabel,
292 selected = _ref2.selected,
293 wide = _ref2.wide,
294 width = _ref2.width,
295 active = _ref2.active,
296 label = _ref2.label,
297 props = objectWithoutProperties._objectWithoutProperties(_ref2, ["disabled", "header", "items", "onChange", "placeholder", "renderLabel", "selected", "wide", "width", "active", "label"]);
298
299 if (active !== undefined) {
300 environment.warnOnce('DropDown:active', 'The “active” prop is deprecated. Please use “selected” to pass the selected index instead.');
301 }
302
303 if (label !== undefined) {
304 environment.warnOnce('DropDown:label', 'DropDown: the “label” prop is deprecated, please use “placeholder” instead.');
305 }
306
307 var theme = Theme.useTheme();
308
309 var _useViewport = Viewport.useViewport(),
310 vw = _useViewport.width;
311
312 var _split = (width || '').split('px'),
313 _split2 = slicedToArray._slicedToArray(_split, 1),
314 _split2$ = _split2[0],
315 widthNoPx = _split2$ === void 0 ? MIN_WIDTH : _split2$;
316
317 var _useState5 = React.useState(0),
318 _useState6 = slicedToArray._slicedToArray(_useState5, 2),
319 buttonWidth = _useState6[0],
320 setButtonWidth = _useState6[1];
321
322 var _useState7 = React.useState(true),
323 _useState8 = slicedToArray._slicedToArray(_useState7, 2),
324 measureWidth = _useState8[0],
325 setMeasureWidth = _useState8[1]; // Adjust the button width if the item widths are larger than declared width
326
327
328 var _useState9 = React.useState(Math.min(widthNoPx, MIN_WIDTH)),
329 _useState10 = slicedToArray._slicedToArray(_useState9, 2),
330 placeholderMinWidth = _useState10[0],
331 setPlaceholderMinWidth = _useState10[1];
332
333 var popoverRefCallback = React.useCallback(function (el) {
334 if (!el) {
335 return;
336 }
337
338 setPlaceholderMinWidth(el.clientWidth);
339 setMeasureWidth(false);
340 }, []);
341 React.useEffect(function () {
342 setMeasureWidth(true);
343 }, [vw, items]); // Update the button width every time the reference updates
344
345 var _useButtonRef = useButtonRef(function (el) {
346 setButtonWidth(el.clientWidth);
347 }),
348 refCallback = _useButtonRef.refCallback,
349 buttonRef = _useButtonRef.buttonRef; // And every time the viewport resizes
350
351
352 React.useEffect(function () {
353 if (!buttonRef.current) {
354 return;
355 }
356
357 setButtonWidth(buttonRef.current.clientWidth);
358 }, [buttonRef, vw]);
359 var selectedIndex = React.useMemo(function () {
360 if (selected !== undefined) {
361 return selected;
362 }
363
364 if (active !== undefined) {
365 return active;
366 }
367
368 return -1;
369 }, [active, selected]);
370
371 var _useDropDown = useDropDown({
372 buttonRef: buttonRef,
373 displayedLabel: placeholder || label,
374 items: items,
375 onChange: onChange,
376 selected: selected
377 }),
378 handleItemSelect = _useDropDown.handleItemSelect,
379 close = _useDropDown.close,
380 toggle = _useDropDown.toggle,
381 opened = _useDropDown.opened,
382 selectedLabel = _useDropDown.selectedLabel;
383
384 var closedWithChanges = !opened && selectedIndex !== -1;
385 var Label = renderLabel;
386 return /*#__PURE__*/React__default.createElement(index$1.i, {
387 name: "DropDown"
388 }, /*#__PURE__*/React__default.createElement(_StyledButtonBase, _extends$1._extends({
389 ref: refCallback,
390 disabled: disabled,
391 onClick: toggle,
392 focusRingRadius: constants.RADIUS,
393 focusRingSpacing: 1
394 }, props, {
395 _css: wide ? 'flex' : 'inline-flex',
396 _css2: 5 * constants.GU,
397 _css3: 2 * constants.GU,
398 _css4: 1.5 * constants.GU,
399 _css5: width || (wide ? '100%' : 'auto'),
400 _css6: wide ? 'auto' : "".concat(placeholderMinWidth, "px"),
401 _css7: disabled ? theme.disabled : theme.surface,
402 _css8: disabled ? theme.disabledContent : theme.surfaceContent,
403 _css9: disabled ? 0 : 1,
404 _css10: closedWithChanges ? theme.selected : theme.border,
405 _css11: textStyles.textStyle('body2'),
406 _css12: disabled ? 'font-weight: 600;' : "\n &:active {\n background: ".concat(theme.surfacePressed, ";\n }\n ")
407 }), /*#__PURE__*/React__default.createElement(_StyledDiv, null, /*#__PURE__*/React__default.createElement(Label, {
408 selectedIndex: selectedIndex,
409 selectedLabel: selectedLabel
410 })), /*#__PURE__*/React__default.createElement(_StyledIconDown, {
411 size: "tiny",
412 _css13: 1.5 * constants.GU,
413 _css14: disabled ? theme.disabledIcon : closedWithChanges ? theme.accent : theme.surfaceIcon
414 })), measureWidth && /*#__PURE__*/React__default.createElement(_StyledDiv2, null, /*#__PURE__*/React__default.createElement(PopoverContent, {
415 refCallback: popoverRefCallback,
416 buttonWidth: buttonWidth,
417 header: header,
418 items: items
419 })), /*#__PURE__*/React__default.createElement(Popover.default, {
420 onClose: close,
421 opener: buttonRef.current,
422 visible: opened
423 }, /*#__PURE__*/React__default.createElement(PopoverContent, {
424 buttonWidth: buttonWidth,
425 header: header,
426 items: items,
427 handleItemSelect: handleItemSelect,
428 selectedIndex: selectedIndex
429 })));
430});
431DropDown.propTypes = {
432 disabled: index.PropTypes.bool,
433 header: index.PropTypes.node,
434 items: index.PropTypes.arrayOf(index.PropTypes.node).isRequired,
435 onChange: index.PropTypes.func.isRequired,
436 placeholder: index.PropTypes.node,
437 renderLabel: index.PropTypes.func,
438 selected: index.PropTypes.number,
439 wide: index.PropTypes.bool,
440 width: index.PropTypes.string,
441 // deprecated
442 active: index.PropTypes.number,
443 label: index.PropTypes.string
444};
445DropDown.defaultProps = {
446 placeholder: 'Select an item',
447 renderLabel: function renderLabel(_ref3) {
448 var selectedLabel = _ref3.selectedLabel;
449 return selectedLabel;
450 },
451 wide: false
452};
453
454var _StyledDiv3 = _styled__default("div").withConfig({
455 displayName: "DropDown___StyledDiv3",
456 componentId: "sc-17zpefi-4"
457})(["min-width:", "px;color:", ";"], function (p) {
458 return p._css15;
459}, function (p) {
460 return p._css16;
461});
462
463var _StyledDiv4 = _styled__default("div").withConfig({
464 displayName: "DropDown___StyledDiv4",
465 componentId: "sc-17zpefi-5"
466})(["padding:", "px ", "px ", "px;", ";", ";"], function (p) {
467 return p._css17;
468}, function (p) {
469 return p._css18;
470}, function (p) {
471 return p._css19;
472}, function (p) {
473 return p._css20;
474}, css.unselectable);
475
476var _StyledUl = _styled__default("ul").withConfig({
477 displayName: "DropDown___StyledUl",
478 componentId: "sc-17zpefi-6"
479})(["margin:0;padding:0;list-style:none;width:100%;"]);
480
481var PopoverContent = React__default.memo(function PopoverContent(_ref4) {
482 var refCallback = _ref4.refCallback,
483 buttonWidth = _ref4.buttonWidth,
484 header = _ref4.header,
485 items = _ref4.items,
486 handleItemSelect = _ref4.handleItemSelect,
487 selectedIndex = _ref4.selectedIndex;
488 var theme = Theme.useTheme();
489 return /*#__PURE__*/React__default.createElement(_StyledDiv3, {
490 _css15: buttonWidth,
491 _css16: theme.surfaceContentSecondary
492 }, header && /*#__PURE__*/React__default.createElement(_StyledDiv4, {
493 _css17: 1.5 * constants.GU,
494 _css18: 2 * constants.GU,
495 _css19: 1.25 * constants.GU,
496 _css20: textStyles.textStyle('label2')
497 }, header), /*#__PURE__*/React__default.createElement(_StyledUl, {
498 ref: refCallback
499 }, /*#__PURE__*/React__default.createElement(index$1.i, {
500 name: "DropDown:menu"
501 }, items.map(function (item, index) {
502 return /*#__PURE__*/React__default.createElement(Item, {
503 key: index,
504 index: index,
505 onSelect: handleItemSelect,
506 theme: theme,
507 item: item,
508 header: header,
509 length: items.length,
510 selected: selectedIndex
511 });
512 }))));
513});
514PopoverContent.propTypes = {
515 refCallback: index.PropTypes.func.isRequired,
516 buttonWidth: index.PropTypes.number.isRequired,
517 header: index.PropTypes.node,
518 items: index.PropTypes.array.isRequired,
519 handleItemSelect: index.PropTypes.func.isRequired,
520 selectedIndex: index.PropTypes.number.isRequired
521};
522PopoverContent.defaultProps = {
523 refCallback: function refCallback() {
524 return null;
525 },
526 handleItemSelect: function handleItemSelect() {
527 return null;
528 },
529 selectedIndex: -1
530};
531
532var _StyledButtonBase2 = _styled__default(ButtonBase.default).withConfig({
533 displayName: "DropDown___StyledButtonBase2",
534 componentId: "sc-17zpefi-7"
535})(["width:100%;text-align:left;padding:", "px ", "px;border-radius:0;color:", ";", ";", " ", " ", " &:active{background:", ";}"], function (p) {
536 return p._css21;
537}, function (p) {
538 return p._css22;
539}, function (p) {
540 return p._css23;
541}, function (p) {
542 return p._css24;
543}, function (p) {
544 return p._css25;
545}, function (p) {
546 return p._css26;
547}, function (p) {
548 return p._css27;
549}, function (p) {
550 return p._css28;
551});
552
553var Item = React__default.memo(function Item(_ref5) {
554 var header = _ref5.header,
555 index = _ref5.index,
556 item = _ref5.item,
557 length = _ref5.length,
558 onSelect = _ref5.onSelect,
559 selected = _ref5.selected,
560 theme = _ref5.theme;
561 var handleClick = React.useCallback(function () {
562 onSelect(index);
563 }, [index, onSelect]);
564 return /*#__PURE__*/React__default.createElement("li", null, /*#__PURE__*/React__default.createElement(_StyledButtonBase2, {
565 onClick: handleClick,
566 _css21: 1.25 * constants.GU,
567 _css22: 2 * constants.GU,
568 _css23: theme.content,
569 _css24: textStyles.textStyle('body2'),
570 _css25: !header && index === 0 ? "border-top-left-radius: ".concat(constants.RADIUS, "px;") : '',
571 _css26: index === length - 1 ? "border-bottom-left-radius: ".concat(constants.RADIUS, "px;") : '',
572 _css27: selected === index ? "\n border-left: 2px solid ".concat(theme.accent, ";\n background: ").concat(theme.surfaceSelected, ";\n ") : '',
573 _css28: theme.surfacePressed
574 }, item));
575});
576Item.propTypes = {
577 header: index.PropTypes.node,
578 index: index.PropTypes.number.isRequired,
579 item: index.PropTypes.node.isRequired,
580 length: index.PropTypes.number.isRequired,
581 onSelect: index.PropTypes.func.isRequired,
582 selected: index.PropTypes.number.isRequired,
583 theme: index.PropTypes.object.isRequired
584};
585
586exports.default = DropDown;
587//# sourceMappingURL=DropDown.js.map