UNPKG

@sendbird/uikit-react-native-foundation

Version:

A foundational UI kit for building chat-enabled React Native apps.

201 lines (200 loc) 6.09 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _reactNative = require("react-native"); var _uikitUtils = require("@sendbird/uikit-utils"); var _Text = _interopRequireDefault(require("../../components/Text")); var _createStyleSheet = _interopRequireDefault(require("../../styles/createStyleSheet")); var _useHeaderStyle = _interopRequireDefault(require("../../styles/useHeaderStyle")); var _useUIKitTheme = _interopRequireDefault(require("../../theme/useUIKitTheme")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const AlignMapper = { left: 'flex-start', center: 'center', right: 'flex-end' }; const Header = ({ children, titleAlign, title = null, left = null, right = null, onPressLeft, onPressRight, clearTitleMargin = false, clearStatusBarTopInset = false, statusBarTopInsetAs = 'padding' }) => { const { topInset, defaultTitleAlign, defaultHeight } = (0, _useHeaderStyle.default)(); const { colors } = (0, _useUIKitTheme.default)(); const safeArea = (0, _uikitUtils.useSafeAreaPadding)(['left', 'right']); const actualTitleAlign = titleAlign ?? defaultTitleAlign; const actualTopInset = clearStatusBarTopInset ? 0 : topInset; if (!title && !left && !right) { return /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: { paddingTop: actualTopInset, backgroundColor: colors.ui.header.nav.none.background } }, children); } return /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: [styles.container, { [statusBarTopInsetAs === 'padding' ? 'paddingTop' : 'marginTop']: actualTopInset, paddingStart: safeArea.paddingStart + styles.container.paddingHorizontal, paddingEnd: safeArea.paddingEnd + styles.container.paddingHorizontal, backgroundColor: colors.ui.header.nav.none.background, borderBottomColor: colors.ui.header.nav.none.borderBottom }] }, /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: [styles.header, { height: defaultHeight }] }, /*#__PURE__*/_react.default.createElement(LeftSide, { titleAlign: actualTitleAlign, left: left, onPressLeft: onPressLeft }), /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: [styles.title, clearTitleMargin && { marginHorizontal: 0 }, { justifyContent: AlignMapper[actualTitleAlign] }] }, typeof title === 'string' ? /*#__PURE__*/_react.default.createElement(HeaderTitle, null, title) : title), /*#__PURE__*/_react.default.createElement(RightSide, { titleAlign: actualTitleAlign, right: right, onPressRight: onPressRight })), children); }; const LeftSide = ({ titleAlign, onPressLeft, left }) => { if (titleAlign === 'center') { return /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: styles.left }, left && /*#__PURE__*/_react.default.createElement(HeaderButton, { onPress: onPressLeft }, left)); } if (!left) return null; return /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: styles.left }, /*#__PURE__*/_react.default.createElement(HeaderButton, { onPress: onPressLeft }, left)); }; const RightSide = ({ titleAlign, onPressRight, right }) => { if (titleAlign === 'center') { return /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: styles.right }, right && /*#__PURE__*/_react.default.createElement(HeaderButton, { onPress: onPressRight }, right)); } if (!right) return null; return /*#__PURE__*/_react.default.createElement(_reactNative.View, { style: styles.right }, /*#__PURE__*/_react.default.createElement(HeaderButton, { onPress: onPressRight }, right)); }; const HeaderTitle = ({ children, style, ...props }) => { return /*#__PURE__*/_react.default.createElement(_Text.default, _extends({}, props, { h1: true, numberOfLines: 1, style: style }), children); }; const HeaderSubtitle = ({ children, style, ...props }) => { const { colors } = (0, _useUIKitTheme.default)(); return /*#__PURE__*/_react.default.createElement(_Text.default, _extends({ color: colors.onBackground03 }, props, { caption2: true, numberOfLines: 1, style: style }), children); }; const HeaderButton = ({ children, disabled, onPress, color, ...props }) => { return /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, _extends({ style: styles.button }, props, { disabled: !onPress || disabled, onPress: e => onPress === null || onPress === void 0 ? void 0 : onPress(e), activeOpacity: 0.7 }), (0, _uikitUtils.conditionChaining)([typeof children === 'string' || typeof children === 'number'], [/*#__PURE__*/_react.default.createElement(_Text.default, { button: true, numberOfLines: 1, color: color }, children), children])); }; const styles = (0, _createStyleSheet.default)({ container: { paddingHorizontal: 12, borderBottomWidth: 1 }, header: { flexDirection: 'row' }, title: { flex: 1, flexDirection: 'row', alignItems: 'center', marginHorizontal: 12 }, left: { height: '100%', minWidth: 32, alignItems: 'center', justifyContent: 'center', marginRight: 12 }, right: { height: '100%', minWidth: 32, alignItems: 'center', justifyContent: 'center', marginLeft: 12 }, button: { padding: 4 } }); var _default = exports.default = Object.assign(Header, { Button: HeaderButton, Title: HeaderTitle, Subtitle: HeaderSubtitle }); //# sourceMappingURL=index.js.map