import * as React from 'react'; import { View, Text, TouchableOpacity, Alert, Image, Modal, ScrollView, BackHandler } from 'react-native'; import { returnIcon } from '../../utils/card'; import { saveUserInfo } from "../../redux/actions/AppUserInfoActions"; import { Input } from 'react-native-elements'; import { connect } from "react-redux"; import { openModal } from '../../redux/actions/AlertActions'; import { AdjustableText } from '../../components/text'; import Assets from '../../components/assets.manager' import CustomSafeArea from '../../components/safeArea.component.js'; import NetInfo from '../../components/netstatus'; import CustomHeader from '../../components/header.js'; import Theme from '../../components/theme.style.js'; import Elements from '../../components/elements.js'; import REQUEST from '../../components/api'; import DB from '../../components/storage/'; import CustomIcon from '../../components/icons.js'; class TopUp extends React.Component { constructor(props) { super(props) this.current = "" } state = { connected: true, loading: false, popup: false, Task: "", DisplayAmount: "", amount: 0, focused: false, checkoutResult: "", userProfile: null, session: null, topupCount: 0, merchant: {}, selectedCreditCard: null, activeIndex: 0, isKeyboardActive: false, transactionType: null, completeModal: false, rate: 0, radius: 0 } componentDidMount() { NetInfo.netstatus(isConnected => { if(isConnected) { this.init() } else { this.setState({ connected: false }) Elements.nointernet2(this.props) } }) } init = async () => { let user = await DB.profile() const session = await DB.session(); this.setState({ loading: true }) await this.getRadiusAndPercentTage(); await this.getSelectedCard(); this.setState({ connected: true, userProfile: user, session: session }) if(user.data.civilstatus_code == "0" || user.data.gender_code == "0") { this.setState({ loading: false }) return Alert.alert("Information", '\n' + "Update your Profile first to use this feature.", [ {text: "CANCEL", onPress: () => { return this.props.navigation.goBack(); }}, {text: "OK", onPress: () => { this.props.navigation.navigate("EditProfile", {data: this.state.userProfile.data, onGoBack: () => { this.init() }}); }} ]); } } getSelectedCard = async () => { const card = await DB.get("topupPaymentCards"); if(card) { return this.setState({ selectedCreditCard: JSON.parse(card) }); } else { return this.getFunding() } } onBackHandler = (type) => { if(type === "disable") return BackHandler.addEventListener("hardwareBackPress", this.onBack); else if (type === "enable")return BackHandler.removeEventListener("hardwareBackPress", this.onBack) } onBack = () => { return true } getFunding = async () => { const USER_PROFILE = await DB.profile(); const SESSION = await DB.session(); await REQUEST("paymaya_tokens", "get", { 'Authorization': SESSION.token }, {noID: true, value: USER_PROFILE.data.card_number}, {}, async (res) => { if(res.data && res.data.cards && res.data.cards.length > 0) { const getDefault = res.data.cards.find(card => card.default); await DB.set( "topupPaymentCards", JSON.stringify(getDefault), () => {}, () => {} ) this.setState({ selectedCreditCard: getDefault }) } this.setState({ loading: false }) }, (error) => { this.onError(error); }, "Funding", "Fetch") } getRadiusAndPercentTage = async () => { const SESSION = await DB.session() REQUEST("getPercentageRadius", "get", { 'Authorization': SESSION.token, }, {}, {}, (res) => { if(res.status === 1) { const { percentage, radius } = res.data; this.setState({ rate: percentage, radius: radius }) } this.setState({ loading: false }) }, (err) => { this.onError(err); }, "Percentage Radius", "Fetch") } moneyFormat = (price, sign = 'PHP ') => { const pieces = parseFloat(price).toFixed(2).split('') let ii = pieces.length - 3 while ((ii-=3) > 0) { pieces.splice(ii, 0, ',') } return sign + pieces.join('') } setamount = (value) => { this.setState({ DisplayAmount: this.moneyFormat(value).toString(), amount: value }) } onAmountChange = (value) => { if(value != this.current){ let parsed = parseFloat(this.clean(value)) if(parsed > 1000000) return false let formatted = this.formatCurrency(parsed) this.current = formatted this.setState({ DisplayAmount: formatted, amount: parseFloat(parsed/100) }) } } clean = (str) => { return str.replace("PHP ", "").replace(".", "").replace(",", "").toString() } formatCurrency = (val) => { let fv = isNaN(val) ? (0).toFixed(2) : parseFloat(val / 100).toFixed(2) let newVal = val.length == 6 ? "PHP " + fv.substr(0, 1) + "," + fv.substr(2, fv.length) : "PHP " + fv; return Theme.formatter.CRNCYNOFIXED(newVal) } validate = () => { NetInfo.netstatus((response) => { if(!response) { Elements.nointernet2(); this.onBackHandler("enable"); } else { if(this.state.amount < 100 || this.state.amount > 10000){ Alert.alert("Invalid Top-Up amount", "\nPlease enter value between 100 - 10,000 pesos only.\n") return false } this.props.openModal({ open: true, title: "Confirm Top-Up", body: `Your card number **** **** **** ${this.state.selectedCreditCard?.last4}\nwill be used to pay for ${Theme.formatter.CRNCY(this.state.amount)} points.`, yesCB: this.topup, theme: this.props.app_theme }) } }) } onReload = (res, msg) => { console.log("onBack", res, msg) } updateTopup = (transactionId, amount, onSuccess, onError) => { REQUEST('topup_transaction_entry', 'post', { Authorization: this.state.session.token }, {}, { amount: amount, paymaya_tranx_id: transactionId }, (res) => onSuccess(res), (error) => onError(error) , "Topup", "Update") } initiateTopup = async () => { let mct = this.state.selectedCreditCard; let SESSION = await DB.session(); REQUEST("payTopUp", 'post', { 'Authorization': SESSION.token, }, {}, { amount: this.state.amount, token: mct.cardTokenId }, (res) => { console.log(res) if(res.status === 1) { this.setState({ loading: false }) let data = { amount: this.state.amount, transactionId: res.data.id, data: {redirectUrl: res.data.response?.verificationUrl || res.data.verificationUrl, card_number: mct.maskedPan, type: 'create' }, onBack: (_, msg) => alert(msg), successCB: () => this.setState({ completeModal: true }) } this.props.navigation.navigate('CheckOut', data); this.onBackHandler("enable"); } }, (err) => this.onError(err) , "Topup", "Initiate") } topup = async () => { this.setState({ loading: true }); this.onBackHandler("disable"); let mct = this.state.selectedCreditCard; let SESSION = await DB.session(); REQUEST('verifyAmount', 'post', { 'Authorization': SESSION.token }, {}, {amount: this.state.amount}, (res) => { console.log(res) if(res.status === 1) { this.initiateTopup(); } else if(res.status === 0) { this.onBackHandler("enable"); this.setState({ loading: false }); if(res.data && res.data.topup_bal_perday !== "0") { return Alert.alert("Information", '\n' + `You only have ${Theme.formatter.CRNCY(res.data.topup_bal_perday)} remaining Top-Up credits today.`, [{text: "OK"}]); } return Alert.alert("Information", '\n' + res.message, [{text: "OK", onPress: () => this.props.navigation.goBack()}]); } }, (err) => { this.onBackHandler("enable"); this.onError(err) }, "Amount", "Verify") } onError = (err) => { this.setState({ loading: false }) if(err?.toJSON().message === 'Network Error') { Elements.nointernet2() } else { Alert.alert("Information", `\n${err.message}`); } } returnCard = () => { return ( this.state.selectedCreditCard ? this.props.navigation.navigate("TopupPaymentList", { onSelectedPaymentCard: (selected) => this.setState({ selectedCreditCard: selected })})}> **** **** **** {this.state.selectedCreditCard.last4} Primary Change : this.props.navigation.navigate("TopupPaymentList", { onSelectedPaymentCard: (selected) => this.setState({ selectedCreditCard: selected })})}> Select Card ) } completeModal = () => { return ( Transaction Completed! {Theme.formatter.NAME(this.props.userinfo.data)} You have received {Theme.formatter.CRNCY((this.state.amount + ((this.state.amount / 100) * this.state.rate)))} POINTS { this.setState({ completeModal: false }); this.props.navigation.goBack() }} style={{paddingHorizontal: 35, paddingVertical: 4, backgroundColor: Theme.colors.primary, borderRadius: 12, marginTop: 20}}> OK ) } render() { if(!this.state.connected){ return ( this.init()} /> ) } return ( {this.completeModal()} Select Top-Up Value Points Get extra {this.state.rate} points for every 100 points top-up! You can buy a maximum of 50,000 points per day this.setamount(100)} style={{flex: 1, margin: 10, padding: 10, borderRadius: 10, borderColor: Theme.colors.primary, borderWidth: 1}}> 100 this.setamount(500)} style={{flex: 1, margin: 10, padding: 10, borderRadius: 10, borderColor: Theme.colors.primary, borderWidth: 1}}> 500 this.setamount(1000)} style={{flex: 1, margin: 10, padding: 10, borderRadius: 10, borderColor: Theme.colors.primary, borderWidth: 1}}> 1000 this.setamount(5000)} style={{flex: 1, margin: 10, padding: 10, borderRadius: 10, borderColor: Theme.colors.primary, borderWidth: 1}}> 5000 this.setState({ focused: true })} onChangeText={(value) => this.onAmountChange(value)} containerStyle={{padding: 0}} inputContainerStyle={{padding: 0, borderBottomWidth: this.state.focused ? 1.75 : 1, borderColor: this.state.focused ? Theme.colors.accent : "gray" }} inputStyle={{padding: 0, fontFamily: 'Arial', fontSize: 16, color: this.props.app_theme?.theme.colors.text }} /> Payment Method {this.returnCard()} {this.state.topupCount >= 5 ? null : this.validate()}> Proceed } ) } } const mapStateToProps = (state) => { return { userinfo: state.appUserInfoReducer.userinfo, app_theme: state.appThemeReducer.theme } } const mapDispatchToProps = { saveUserInfo, openModal } export default connect(mapStateToProps, mapDispatchToProps)(TopUp);