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);