@devrue/rn-select
Version:
Custom typescript only select component for react native
141 lines (139 loc) • 6.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = Anchor;
var _react = _interopRequireWildcard(require("react"));
var _reactNative = require("react-native");
var _useStyles = _interopRequireDefault(require("../hooks/useStyles"));
var _ChevronDownIcon = _interopRequireDefault(require("../icons/ChevronDownIcon"));
var _Selections = _interopRequireDefault(require("./Selections"));
var _CloseIcon = _interopRequireDefault(require("../icons/CloseIcon"));
var _debounce = _interopRequireDefault(require("lodash/debounce"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function _extends() { _extends = Object.assign ? Object.assign.bind() : 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); }
function Anchor({
placeholder,
selected,
multi = false,
clearable,
disabled,
onRemove,
onClear,
onLayout,
selectStyle,
selectPlaceholderTextStyle,
selectTextStyle,
selectPillTextStyle,
selectPillRemoveContainerStyle,
selectPillRemoveIconStyle,
selectIconStyle,
...rest
}) {
var _selected$;
const styles = (0, _useStyles.default)(({
tokens,
hairlineWidth
}) => ({
anchorContainer: {
height: tokens.size.xl + 4,
paddingLeft: tokens.size.xs,
borderColor: '#c5c5c5',
borderWidth: hairlineWidth,
borderRadius: tokens.size.xs,
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center'
},
icon: {
width: (selectIconStyle === null || selectIconStyle === void 0 ? void 0 : selectIconStyle.fontSize) ?? tokens.size.sm,
height: (selectIconStyle === null || selectIconStyle === void 0 ? void 0 : selectIconStyle.fontSize) ?? tokens.size.sm,
paddingHorizontal: tokens.size.sm - 4
},
iconContainer: {
flexDirection: 'row',
alignItems: 'center'
},
fill: {
flex: 1
},
placeholder: {
color: '#808080'
},
closeIconContainer: {
height: tokens.size.xl + 4,
justifyContent: 'center'
},
disabled: {
cursor: 'not-allowed',
backgroundColor: 'white',
opacity: 0.4,
borderRadius: tokens.size.xs
}
}), [selectIconStyle, disabled]);
const ref = (0, _react.useRef)(null);
const onLayoutRef = (0, _react.useRef)(onLayout);
(0, _react.useEffect)(() => {
const updatePosition = () => {
if (ref.current) {
ref.current.measure((x, y, width, height, pageX, pageY) => {
onLayoutRef.current({
x,
y,
width,
height,
left: pageX,
top: pageY
});
});
}
};
const debouncedUpdate = (0, _debounce.default)(updatePosition, 16);
const subscription = _reactNative.Dimensions.addEventListener('change', debouncedUpdate);
// Track scroll events on web
if (_reactNative.Platform.OS === 'web' && window) {
window.addEventListener('scroll', debouncedUpdate, true);
}
updatePosition();
return () => {
subscription.remove();
debouncedUpdate.cancel();
if (_reactNative.Platform.OS === 'web') {
window.removeEventListener('scroll', debouncedUpdate, true);
}
};
}, []);
return /*#__PURE__*/_react.default.createElement(_reactNative.Pressable, _extends({
ref: ref
}, rest, {
style: [styles.anchorContainer, selectStyle]
}), selected.length === 0 && /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
style: [styles.placeholder, selectPlaceholderTextStyle, styles.fill],
numberOfLines: 1
}, placeholder), selected.length === 1 && !multi && /*#__PURE__*/_react.default.createElement(_reactNative.Text, {
style: [selectTextStyle, styles.fill],
numberOfLines: 1
}, (_selected$ = selected[0]) === null || _selected$ === void 0 ? void 0 : _selected$[1]), selected.length > 0 && multi && /*#__PURE__*/_react.default.createElement(_Selections.default, {
items: selected,
onRemove: onRemove,
pillTextStyle: selectPillTextStyle,
pillRemoveContainerStyle: selectPillRemoveContainerStyle,
pillRemoveIconStyle: selectPillRemoveIconStyle
}), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
style: styles.iconContainer
}, selected.length > 0 && clearable && !disabled && /*#__PURE__*/_react.default.createElement(_reactNative.Pressable, {
style: styles.closeIconContainer,
onPress: onClear
}, /*#__PURE__*/_react.default.createElement(_CloseIcon.default, {
stroke: (selectIconStyle === null || selectIconStyle === void 0 ? void 0 : selectIconStyle.color) ?? '#c5c5c5',
style: styles.icon
})), /*#__PURE__*/_react.default.createElement(_ChevronDownIcon.default, {
stroke: (selectIconStyle === null || selectIconStyle === void 0 ? void 0 : selectIconStyle.color) ?? '#c5c5c5',
style: styles.icon
})), disabled && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
style: [_reactNative.StyleSheet.absoluteFill, styles.disabled]
}));
}
//# sourceMappingURL=Anchor.js.map