import * as React from 'react'; import { connect } from "react-redux"; import { SafeAreaView, TouchableOpacity, View, Text, FlatList, Image, StyleSheet, Alert, Modal } from 'react-native'; import { returnIcon } from '../../utils/card'; import REQUEST_POST_PAY from '../../components/api/postpayapi'; import Icon from '../../components/icons.js'; import CustomHeader from '../../components/header.js'; import Theme from '../../components/theme.style.js'; import Assets from '../../components/assets.manager.js'; import Elements from '../../components/elements.js'; import DB from '../../components/storage/'; import CustomSafeArea from '../../components/safeArea.component'; class PayatpumpPaymentList extends React.Component { constructor(props) { super(props) } state = { cards: [], defaultCardIndex: -1, defaultSelectedCard: null, showModal: false, showCardAdded: false, showCardDeleted: false, deleteCard: null, loading: false, newlyAddedCard: null, isShowSelectionCard: this.props.route.params?.displaySelectionCard } componentDidMount() { this.getFunding() } getFunding = async (defaultCard = null, enableDefaultCard = false, setDefault = false) => { this.setState({ loading: true }) REQUEST_POST_PAY('getFunding', 'post', {}, {}, {}, async (res) => { this.setState({ loading: false }) if(!res.status) { Alert.alert("Information", '\n' + 'Failed to get fund. Try again.') } else { let savedCard = await DB.get("pumpPaymentCards"); let selectedCard = JSON.parse(savedCard); let wallets = res.data.wallets.map(item => { let wallet = item.wallets.map(walletItem => { let fundingProviderName = item.fundingProviderName return {...walletItem, fundingProviderName} }) return wallet }) var mergedWallets = [].concat.apply([], wallets) let defaultIndex = -1; let selectedDefaultCard = null if(enableDefaultCard) { defaultIndex = mergedWallets.findIndex(item => item.userPaymentSourceId === defaultCard.userPaymentSourceId); selectedDefaultCard = mergedWallets[defaultIndex]; await DB.set( "pumpPaymentCards", JSON.stringify(selectedDefaultCard), () => {}, () => {} ) } else { if(selectedCard && !setDefault) { defaultIndex = mergedWallets.findIndex(item => item.userPaymentSourceId === selectedCard.userPaymentSourceId); selectedDefaultCard = mergedWallets[defaultIndex]; } } this.setState({ cards: mergedWallets, defaultCardIndex: defaultIndex, defaultSelectedCard: selectedDefaultCard, deleteCard: null }) } }, (error) => { this.setState({ loading: false }) setTimeout(() => { Alert.alert("Information", '\n' + 'Failed to get fund. Try again.') }, 300) }) } deleteCard = async () => { this.setState({ loading: true, showModal: false }) const USER_PROFILE = await DB.profile() REQUEST_POST_PAY('deleteCreditCard', 'post', { token: USER_PROFILE.data.auth_p97 }, {}, { userPaymentSourceId: this.state.deleteCard.userPaymentSourceId }, async (res) => { this.setState({ loading: false }) if(res.success == undefined) { setTimeout(() => { Alert.alert("Information", '\n' + res.Message) }, 300) } else { if(res.success) { let selectedCard = await DB.get("pumpPaymentCards"); let defaultCardIndex = -1; let defaultSelectedCard = null; let wallets = this.state.cards.filter(item => { return item.userPaymentSourceId != this.state.deleteCard.userPaymentSourceId }) .map(item => { return item }) if(wallets.length > 0) { let checker = wallets.find(item => item.userPaymentSourceId === selectedCard.userPaymentSourceId); if(!checker) { defaultCardIndex = 0; defaultSelectedCard = wallets[defaultCardIndex]; this.props.route?.params.onSelectedPaymentCard && this.props.route?.params.onSelectedPaymentCard(defaultSelectedCard) await DB.set( "pumpPaymentCards", JSON.stringify(defaultSelectedCard), () => {}, () => {} ) } } else { this.props.route?.params.onSelectedPaymentCard && this.props.route?.params.onSelectedPaymentCard(null) await DB.set( "pumpPaymentCards", JSON.stringify(null), () => {}, () => {} ) } this.setState({ showCardDeleted: true, cards: wallets, defaultCardIndex: defaultCardIndex, defaultSelectedCard: defaultSelectedCard, deleteCard: null }) } else { setTimeout(() => { Alert.alert("Information", '\n' + 'Failed to get fund. Try again.') }, 300) } } }, (error) => { this.setState({ loading: false }) setTimeout(() => { Alert.alert("Information", '\n' + error) }, 300) }) } setDefaultCard = async (defaultSelectedCard) => { let USER_PROFILE = await DB.profile(); let data = { "fundingProviderName": "p97token", "userPaymentSourceId": defaultSelectedCard.userPaymentSourceId } REQUEST_POST_PAY("postPayDefaultCard", "post", { token: USER_PROFILE.data.auth_p97 }, {}, data, (res) => { }, (err) => { }) } submitPaymentCard = async (defaultSelectedCard) => { // this.setDefaultCard(defaultSelectedCard); if(defaultSelectedCard == null) { this.setState({ showModal: true }) return } await DB.set( "pumpPaymentCards", JSON.stringify(defaultSelectedCard), () => { this.props.route?.params.onSelectedPaymentCard && this.props.route?.params.onSelectedPaymentCard(defaultSelectedCard) this.props.navigation.goBack(); }, () => {} ) } onSetLoading = () => { this.setState({ loading: true }) } onAddNewCard = (response, enableDefaultCard) => { this.setState({showCardAdded: true, newlyAddedCard: response}); this.getFunding(response, enableDefaultCard); } returnCardName = (card) => { let newCard = card.cardIssuerId; if(newCard.includes("-")) { newCard = newCard.split("-")[0]; } if(newCard === "Mastercard") { newCard = "MASTER" } return newCard.toUpperCase(); } renderDeleteErrorModal = () => { return ( {}} style={styles.centeredView}> Confirmation Are you sure you want to delete{'\n'}this card? this.setState({ showModal: false })} style={{ flex: 1, alignItems: 'center', justifyContent: 'center', paddingVertical: 7, marginRight: 6, borderWidth: 1, borderColor: Theme.colors.primary, borderRadius: 5 }}> No this.deleteCard()} style={{ flex: 1, alignItems: 'center', justifyContent: 'center', marginLeft: 6, paddingVertical: 7, borderWidth: 1, borderColor: Theme.colors.primary, backgroundColor: Theme.colors.primary, borderRadius: 5 }}> Yes ) } renderCardAdded = () => { let card = this.state.cards.find(item => item.userPaymentSourceId === this.state.newlyAddedCard?.userPaymentSourceId); if(card && this.state.showCardAdded && !this.state.loading) { return ( {this.returnCardName(card)} ending in {card?.lastFour} has been{'\n'}successfully added! {this.setState({ showCardAdded: false, newlyAddedCard: null })}} style={{paddingVertical: 10, borderRadius: 5, marginTop: 10, width: 120, backgroundColor: Theme.colors.primary, alignItems: 'center'}}> OK ) } return null } renderCardDeleted = () => { if(this.state.showCardDeleted) { return ( Deleted Successfully Your card has been successfully{'\n'}deleted! {this.setState({ showCardDeleted: false })}} style={{paddingVertical: 5, borderRadius: 5, marginTop: 10, width: 120, backgroundColor: Theme.colors.primary, alignItems: 'center'}}> OK ) } return null; } renderCardList = () => { return ( index.toString()} data={this.state.cards} scrollEnabled={true} showsVerticalScrollIndicator={false} style={this.state.cards.length === 0 && {flex: 1}} contentContainerStyle={this.state.cards.length === 0 && {flex: 1}} ListEmptyComponent={() => ( Empty )} renderItem={({item, index}) => { return ( { this.submitPaymentCard(item); }} key={index} style={{ flex: 1, alignItems: 'center', justifyContent: 'center', flexDirection: 'row', backgroundColor: this.props.app_theme?.theme.dark ? this.props.app_theme?.theme.colors.background : Theme.colors.white, padding: 12 }}> {this.state.defaultCardIndex == index && } {`**** **** **** ${item.lastFour}`} {this.state.defaultCardIndex == index && Primary} this.setState({ deleteCard: item, showModal: true })} style={{ paddingVertical: 5 }}> ) }} numColumns={1} /> ) } render() { return ( this.props.navigation.goBack()} back={true} menu={false} navigation={this.props.navigation} /> {this.renderCardList()} this.props.navigation.navigate('PayatpumpPaymentMethod', { onSetLoading: () => this.onSetLoading(), onAddNewCard: (newcard, enableDefaultCard) => this.onAddNewCard(newcard, enableDefaultCard)})} style={{alignSelf: 'center'}} > Add a Card {this.renderCardAdded()} {this.renderCardDeleted()} {this.renderDeleteErrorModal()} ) } } const mapStateToProps = (state) => { return { app_theme: state.appThemeReducer.theme } } export default connect(mapStateToProps, null)(PayatpumpPaymentList) const styles = StyleSheet.create({ centeredView: { flex: 1, justifyContent: "center", backgroundColor: '#00000090', }, modalView: { margin: 25, backgroundColor: "white", paddingHorizontal: 20, paddingVertical: 30, alignItems: "center", shadowColor: "#000", shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.25, shadowRadius: 4, elevation: 5 }, })