@sendbird/uikit-react-native-foundation
Version:
A foundational UI kit for building chat-enabled React Native apps.
153 lines (151 loc) • 5.64 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
var _reactNative = require("react-native");
var _uikitUtils = require("@sendbird/uikit-utils");
var _Modal = _interopRequireDefault(require("../../components/Modal"));
var _Text = _interopRequireDefault(require("../../components/Text"));
var _TextInput = _interopRequireDefault(require("../../components/TextInput"));
var _createStyleSheet = _interopRequireDefault(require("../../styles/createStyleSheet"));
var _useHeaderStyle = _interopRequireDefault(require("../../styles/useHeaderStyle"));
var _useUIKitTheme = _interopRequireDefault(require("../../theme/useUIKitTheme"));
var _Button = _interopRequireDefault(require("../Button"));
var _DialogBox = _interopRequireDefault(require("../Dialog/DialogBox"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
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 && {}.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; }
const Prompt = ({
onDismiss,
visible,
onHide,
autoFocus = true,
title,
defaultValue = '',
placeholder = 'Enter',
onSubmit = _uikitUtils.NOOP,
onCancel = _uikitUtils.NOOP,
submitLabel = 'Submit',
cancelLabel = 'Cancel'
}) => {
const {
statusBarTranslucent
} = (0, _useHeaderStyle.default)();
const {
colors
} = (0, _useUIKitTheme.default)();
const inputRef = (0, _react.useRef)(null);
const {
width,
height
} = (0, _reactNative.useWindowDimensions)();
const buttons = [{
text: cancelLabel,
onPress: onCancel
}, {
text: submitLabel,
onPress: () => onSubmit(text)
}];
const [text, setText] = (0, _react.useState)(defaultValue);
// FIXME: autoFocus trick with modal
// Android
// - InputProps.autoFocus is not trigger keyboard appearing.
// - InputRef.focus() is trigger keyboard appearing, but position of keyboard selection is always the start of text.
// iOS
// - InputProps.autoFocus is trigger weird UI behavior on landscape mode.
(0, _react.useEffect)(() => {
if (autoFocus && visible) {
setTimeout(() => {
var _inputRef$current, _inputRef$current2;
if (_reactNative.Platform.OS === 'android') (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 || _inputRef$current.blur();
(_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 || _inputRef$current2.focus();
}, 250);
}
}, [autoFocus, visible, `${width}-${height}`]);
return /*#__PURE__*/_react.default.createElement(_Modal.default, {
enableKeyboardAvoid: true,
disableBackgroundClose: true,
onClose: onHide,
onDismiss: () => {
setText('');
onDismiss === null || onDismiss === void 0 || onDismiss();
},
statusBarTranslucent: statusBarTranslucent,
visible: visible,
backgroundStyle: {
alignItems: 'center',
justifyContent: 'center'
}
}, /*#__PURE__*/_react.default.createElement(_DialogBox.default, {
style: styles.container
}, Boolean(title) && /*#__PURE__*/_react.default.createElement(_reactNative.View, {
style: styles.titleContainer
}, /*#__PURE__*/_react.default.createElement(_Text.default, {
h1: true,
color: colors.ui.dialog.default.none.text,
numberOfLines: 1
}, title)), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
style: styles.inputContainer
}, /*#__PURE__*/_react.default.createElement(_TextInput.default, {
autoFocus: autoFocus && _reactNative.Platform.OS === 'android',
ref: inputRef,
placeholder: placeholder,
variant: 'underline',
value: text,
onChangeText: setText,
style: {
paddingStart: 0,
paddingEnd: 0,
paddingTop: 10,
paddingBottom: 10
}
})), /*#__PURE__*/_react.default.createElement(_reactNative.View, {
style: styles.buttonContainer
}, buttons.map(({
text,
onPress
}, index) => {
return /*#__PURE__*/_react.default.createElement(_Button.default, {
key: text + index,
variant: 'text',
style: styles.button,
contentColor: colors.ui.dialog.default.none.highlight,
onPress: () => {
_reactNative.Keyboard.dismiss();
try {
onPress === null || onPress === void 0 || onPress();
} finally {
onHide();
}
}
}, text);
}))));
};
const styles = (0, _createStyleSheet.default)({
container: {
paddingTop: 8
},
titleContainer: {
marginBottom: 12,
paddingVertical: 12,
paddingHorizontal: 24,
alignItems: 'flex-start'
},
inputContainer: {
paddingHorizontal: 24,
marginBottom: 12
},
buttonContainer: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'flex-end',
padding: 12
},
button: {
marginStart: 8
}
});
var _default = exports.default = Prompt;
//# sourceMappingURL=index.js.map