/* global alert */ import React, { Component } from 'react'; import { Animated, StyleSheet, View, TouchableOpacity, Clipboard, Share } from 'react-native'; // import { QRCode } from 'react-native-custom-qr-codes'; import { BlueLoading, BlueText, SafeBlueArea, BlueButton, BlueNavigationStyle, BlueSpacing20 } from '../../BlueComponents'; import PropTypes from 'prop-types'; import ReactNativeHapticFeedback from 'react-native-haptic-feedback'; /** @type {AppStorage} */ let BlueApp = require('../../BlueApp'); const loc = require('../../loc'); const EV = require('../../events'); const QRFast = require('react-native-qrcode'); export default class LNDViewInvoice extends Component { static navigationOptions = ({ navigation }) => ({ ...BlueNavigationStyle(navigation, true, () => navigation.dismiss()), title: loc.receive.header, headerLeft: null, }); constructor(props) { super(props); const invoice = props.navigation.getParam('invoice'); const fromWallet = props.navigation.getParam('fromWallet'); this.state = { invoice, fromWallet, isLoading: typeof invoice === 'string', addressText: typeof invoice === 'object' ? invoice.payment_request : invoice, isFetchingInvoices: false, }; this.fetchInvoiceInterval = undefined; } async componentDidMount() { this.fetchInvoiceInterval = setInterval(async () => { if (!this.state.isFetchingInvoices) { try { this.setState({ isFetchingInvoices: true }); const userInvoices = JSON.stringify(await this.state.fromWallet.getUserInvoices()); const updatedUserInvoice = JSON.parse(userInvoices).filter(invoice => typeof this.state.invoice === 'object' ? invoice.payment_request === this.state.invoice.payment_request : invoice.payment_request === this.state.invoice, )[0]; this.setState({ invoice: updatedUserInvoice, isLoading: false, addressText: updatedUserInvoice.payment_request }); if (updatedUserInvoice.ispaid) { this.setState({ isFetchingInvoices: false }); ReactNativeHapticFeedback.trigger('notificationSuccess', false); clearInterval(this.fetchInvoiceInterval); this.fetchInvoiceInterval = undefined; EV(EV.enum.TRANSACTIONS_COUNT_CHANGED); } else { const currentDate = new Date(); const now = (currentDate.getTime() / 1000) | 0; const invoiceExpiration = updatedUserInvoice.timestamp + updatedUserInvoice.expire_time; if (invoiceExpiration < now && !updatedUserInvoice.ispaid) { this.setState({ isFetchingInvoices: false }); ReactNativeHapticFeedback.trigger('notificationError', false); clearInterval(this.fetchInvoiceInterval); this.fetchInvoiceInterval = undefined; EV(EV.enum.TRANSACTIONS_COUNT_CHANGED); } } } catch (error) { console.log(error); alert(error); this.props.navigation.dismiss(); } } }, 5000); } componentWillUnmount() { clearInterval(this.fetchInvoiceInterval); this.fetchInvoiceInterval = undefined; } copyToClipboard = () => { this.setState({ addressText: loc.receive.details.copiedToClipboard }, () => { Clipboard.setString(this.state.invoice.payment_request); setTimeout(() => this.setState({ addressText: this.state.invoice.payment_request }), 1000); }); }; render() { if (this.state.isLoading) { return ; } const { invoice } = this.state; if (typeof invoice === 'object') { const currentDate = new Date(); const now = (currentDate.getTime() / 1000) | 0; const invoiceExpiration = invoice.timestamp + invoice.expire_time; if (invoice.ispaid) { return ( This invoice has been paid for. ); } if (invoiceExpiration < now && !invoice.ispaid) { return ( This invoice was not paid for and has expired. ); } else if (invoiceExpiration > now && invoice.ispaid) { if (invoice.ispaid) { return ( 'This invoice has been paid for.' ); } } } // Invoice has not expired, nor has it been paid for. return ( {this.state.addressText} this.props.navigation.navigate('LNDViewAdditionalInvoiceInformation', { fromWallet: this.state.fromWallet })} title="Additional Information" /> { Share.share({ message: invoice.payment_request, }); }} title={loc.receive.details.share} /> ); } } const styles = StyleSheet.create({ address: { marginVertical: 32, fontSize: 15, color: '#9aa0aa', textAlign: 'center', }, }); LNDViewInvoice.propTypes = { navigation: PropTypes.shape({ goBack: PropTypes.function, navigate: PropTypes.function, getParam: PropTypes.function, dismiss: PropTypes.function, }), };