@oxyhq/services
Version:
Reusable OxyHQ module to handle authentication, user management, karma system, device-based session management and more 🚀
130 lines (128 loc) • 3.82 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = require("react");
var _reactNative = require("react-native");
var _fonts = require("../styles/fonts");
var _OxyContext = require("../context/OxyContext");
var _OxyLogo = _interopRequireDefault(require("./OxyLogo"));
var _jsxRuntime = require("react/jsx-runtime");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/**
* A pre-styled button for OxyPay payments that opens the Payment Gateway
* - Only black or white by default, but can be customized with the color prop.
*/
const OxyPayButton = ({
style,
textStyle,
text = 'Pay',
disabled = false,
amount,
currency = 'FAIR',
paymentItems,
description,
onPaymentResult,
color,
variant = 'white'
}) => {
const {
showBottomSheet
} = (0, _OxyContext.useOxy)();
const [buttonHeight, setButtonHeight] = (0, _react.useState)(52);
const handlePress = () => {
showBottomSheet?.({
screen: 'PaymentGateway',
props: {
amount,
currency,
paymentItems,
description,
onPaymentResult
}
});
};
// Determine background and text color
const backgroundColor = color || (variant === 'black' ? '#111' : '#fff');
const textColor = variant === 'black' || color && isColorDark(color) ? '#fff' : '#1b1f0a';
// Responsive sizing
const logoWidth = Math.round(buttonHeight * 0.5); // 50% of button height
const logoHeight = Math.round(buttonHeight * 0.25); // 25% of button height
const fontSize = Math.round(buttonHeight * 0.35); // 35% of button height
const handleLayout = e => {
const h = e.nativeEvent.layout.height;
if (h && Math.abs(h - buttonHeight) > 1) setButtonHeight(h);
};
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.TouchableOpacity, {
style: [styles.button, {
backgroundColor,
borderColor: textColor,
borderWidth: 1
}, disabled && styles.buttonDisabled, style],
onPress: handlePress,
disabled: disabled,
activeOpacity: 0.85,
onLayout: handleLayout,
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
style: styles.buttonContent,
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_OxyLogo.default, {
width: logoWidth,
height: logoHeight,
style: {
marginRight: logoWidth * 0.12,
marginTop: (fontSize - logoHeight) / 2
},
fillColor: textColor
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.Text, {
style: [styles.text, {
color: textColor,
fontSize
}, textStyle],
children: text
})]
})
});
};
// Helper to determine if a color is dark (simple luminance check)
function isColorDark(hex) {
let c = hex.replace('#', '');
if (c.length === 3) c = c.split('').map(x => x + x).join('');
if (c.length !== 6) return false;
const r = Number.parseInt(c.substr(0, 2), 16);
const g = Number.parseInt(c.substr(2, 2), 16);
const b = Number.parseInt(c.substr(4, 2), 16);
// Perceived luminance
return 0.299 * r + 0.587 * g + 0.114 * b < 150;
}
const styles = _reactNative.StyleSheet.create({
button: {
padding: 14,
borderRadius: 35,
alignItems: 'center',
justifyContent: 'center',
flexDirection: 'row',
minHeight: 52
},
buttonDisabled: {
opacity: 0.6
},
buttonContent: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center'
},
oxyLogo: {
// marginRight is set dynamically
},
centeredItem: {
justifyContent: 'center',
alignItems: 'center'
},
text: {
fontFamily: _fonts.fontFamilies.phudu,
fontWeight: '700'
}
});
var _default = exports.default = OxyPayButton;
//# sourceMappingURL=OxyPayButton.js.map