UNPKG

react95-native

Version:

Refreshed Windows 95 style UI components for your React Native app

190 lines (167 loc) 6.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _reactNative = require("react-native"); var _theming = require("../../core/theming"); var _styles = require("../../styles/styles"); var _shadow = _interopRequireDefault(require("../../styles/shadow")); var _SelectBase = _interopRequireDefault(require("./SelectBase")); var _ = require("../.."); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } const Select = ({ disabled = false, menuMaxHeight, onChange, options = [], style, theme, value, ...rest }) => { const [isOpen, setIsOpen] = (0, _react.useState)(false); const [isPressed, setIsPressed] = (0, _react.useState)(false); function handleOptionSelect(option) { onChange(option.value); setIsOpen(false); } function getLabelContainerBackgroundColor() { if (disabled) { return theme.material; } if (isPressed) { return theme.hoverBackground; } return theme.canvas; } const [selectedOptions, selectOptions] = (0, _SelectBase.default)({ options, values: [value], onChange: handleOptionSelect, theme }); const selectedOption = selectedOptions[0]; // TODO: close dropdown when user touches outside of component // TODO: native prop to use native select const borderStyles = (0, _styles.buildBorderStyles)(theme); const textStyles = (0, _styles.builtTextStyles)(theme); return /*#__PURE__*/_react.default.createElement(_.Panel, _extends({ theme: theme, variant: "cutout", background: disabled ? 'material' : 'canvas', style: [styles.wrapper, style] }, rest), /*#__PURE__*/_react.default.createElement(_reactNative.TouchableHighlight, { onPress: () => setIsOpen(currentIsOpen => !currentIsOpen), activeOpacity: 1, disabled: disabled, onHideUnderlay: () => setIsPressed(false), onShowUnderlay: () => setIsPressed(true) // TODO: accessibility // accessibilityTraits // accessibilityComponentType // accessibilityRole // accessibilityState , underlayColor: "none" }, /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: [styles.inner] }, /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: [styles.flex] }, /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: [styles.selectValue, { backgroundColor: disabled ? theme.material : theme.canvas }] }, /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: [styles.center, { borderWidth: 2, borderColor: disabled ? theme.material : theme.canvas, backgroundColor: getLabelContainerBackgroundColor() }, isPressed && borderStyles.focusSecondaryOutline] }, /*#__PURE__*/_react.default.createElement(_.Text, { theme: theme, style: [styles.textValue, disabled ? textStyles.disabled : textStyles.default, !disabled && isPressed && { color: isPressed ? theme.canvasTextInvert : theme.canvasText }] }, selectedOption.label))), /*#__PURE__*/_react.default.createElement(_.Panel, { theme: theme, variant: isPressed ? 'default' : 'raised', invert: isPressed, style: [styles.fakeButton] }, /*#__PURE__*/_react.default.createElement(_.ArrowIcon, { theme: theme, segments: 4, direction: "down", disabled: disabled, style: { paddingTop: isPressed ? 2 : 0 } }))), isOpen && /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: [styles.options, { height: menuMaxHeight || 'auto', backgroundColor: theme.canvas, borderColor: theme.borderDarkest }] }, /*#__PURE__*/_react.default.createElement(_.ScrollView, { theme: theme }, selectOptions))))); }; const selectHeight = _styles.blockSizes.md; const styles = _reactNative.StyleSheet.create({ wrapper: { height: selectHeight, alignSelf: 'flex-start', padding: 0 }, inner: { position: 'relative', padding: 4 }, flex: { display: 'flex', flexDirection: 'row', justifyContent: 'space-between', alignContent: 'center', alignItems: 'center', height: '100%' }, selectValue: { flexGrow: 1, flex: 1, height: '100%', padding: 2 }, center: { flexGrow: 1, flex: 1, height: '100%', justifyContent: 'center' }, textValue: { fontSize: 16, paddingHorizontal: 4 }, fakeButton: { position: 'relative', height: '100%', width: 30, padding: 4, alignItems: 'center', justifyContent: 'center' }, options: { position: 'absolute', top: selectHeight, left: 0, right: 0, borderWidth: 2, padding: 2, display: 'flex', ...(0, _shadow.default)(2) } }); var _default = (0, _theming.withTheme)(Select); exports.default = _default; //# sourceMappingURL=Select.js.map