import React from 'react'; import { useState, useEffect, useRef } from 'react'; import { connect } from 'react-redux'; import { Text, View, TouchableOpacity, Linking, Platform, Alert, Modal, FlatList, Image, ActivityIndicator } from 'react-native'; import { List, ListItem, Left, Right } from 'native-base'; import REQUEST_POST_PAY from '../../../components/api/postpayapi'; import Assets from '../../../components/assets.manager.js'; import BottomSheet from 'reanimated-bottom-sheet'; import Theme from '../../../components/theme.style.js'; import Icon from '../../../components/icons'; import DB from '../../../components/storage/'; import { NavigationApps,actions,googleMapsTravelModes, mapsTravelModes } from "../../../components/navigationapps"; import Elements from '../../../components/elements.js'; const styles = { container: { flex: 1, backgroundColor: '#f8f9fa', alignItems: 'center', justifyContent: 'center' }, panel: { flex: 1, backgroundColor: 'white', position: 'relative' }, panelHeader: { height: 60, backgroundColor: Theme.colors.lightGray, alignItems: 'center', justifyContent: 'center' }, centeredView: { flex: 1, justifyContent: "center", backgroundColor: '#00000090', }, modalView: { margin: 25, borderRadius: 15, padding: 20, alignItems: "center", shadowColor: "#000", shadowOffset: { width: 0, height: 2 }, shadowOpacity: 0.25, shadowRadius: 4, elevation: 5 }, selectedPumpBorder: { backgroundColor: '#ffbaa3', borderRadius: 10, borderWidth: 2, borderColor: Theme.colors.primary, padding: 5 }, unselectedPumpBorder: { borderRadius: 10, borderWidth: 2, padding: 5 } } const PayatpumpStationDetails = (props) => { const [panel, setpanel] = useState(null) const [updateFavorite, setUpdateFavorite] = useState(0) const [updateFavoriteVal, setUpdateFavoriteVal] = useState(false) const [showModal, setShowModal] = useState(false) const [error, setError] = useState(null) const [selectedPump, setSelectedPump] = useState(null) const [initiateCancel, setInitiateCancel] = useState(false) const [initiateProceed, setInitiateProceed] = useState(false) const [confirmProceed, setConfirmProceed] = useState(false) var timerRef = null useEffect(() => { if(props.visible){ panel.show() } return setpanel(null) }, [props.visible]) const renderStationDetails = (station, onPress) => { let stars = [1,2,3,4,5].map((star, i) => { let name = station.stars >= star ? "star" : "staro" let mgn = i > 0 ? 5 : 0 return ( ) }) // filter the value of key pair if it is empty var filteredAddress = Object.entries(station.address).filter(([key, value]) => { if(key === "stateCode") return `${value.replace(/\s/g, '')}` return `${value}` }) .map(([key, value]) => `${value}`) return ( {filteredAddress.join(', ').toString()} Contact: { let url = Platform.OS == 'ios' ? 'telprompt:' : 'tel:' Linking.canOpenURL(url).then(supported => { if (!supported) { console.log('Cant handle url') alert("Call Not Supported") } else { Alert.alert("Call Customer Service", "You will be redirected to the dialer to call Unioil Customer Service", [ { text: 'Cancel', style: 'cancel', },{ text: 'OK', onPress: () => Linking.openURL(`${url}${num}`) } ], {cancelable: true}) return true } }).catch(err => { console.error('An error occurred', err) }) }}> {station.phone} {stars} { if(props.data.fuelService?.fuelingPoints == undefined) { Alert.alert("Error", "No pump available.") } else { setShowModal(true) } }} style={{ backgroundColor: Theme.colors.primary, padding: 12, alignSelf: 'center', alignItems: 'center', justifyContent: 'center', borderRadius: 5 }}> Pay at Pump Fuel Prices {/* Last Update: {station.latest_update} */} {station.fuelService.fuelProducts != undefined && station.fuelService.fuelProducts.length > 0 ? ( index.toString()} data={station.fuelService.fuelProducts} scrollEnabled={true} showsVerticalScrollIndicator={false} renderItem={({item, index}) => { return ( {item.name} ₱ {item.creditPrice} ) }} /> ) : ( No Current Data )} {PumpSelectorModalView()} ) } const resetFlags = () => { setShowModal(false) setSelectedPump(null) setInitiateCancel(false) setInitiateProceed(false) setConfirmProceed(false) } const initiateTransaction = async () => { const USER_PROFILE = await DB.profile(); let store = props.data let pump = selectedPump let params = { storeId: store.storeId, pump: pump.pumpNumber } REQUEST_POST_PAY('postClaim', 'post', { token: USER_PROFILE.data.auth_p97 }, {}, params, async (res) => { console.log(res) if(res.success == undefined) { resetFlags() setTimeout(() => { Alert.alert('Error', res.Message) }, 300) } else { if(res.success) { resetFlags() props.onTransaction(res.response, store.storeId, selectedPump) } else { resetFlags() setTimeout(() => { Alert.alert('Error', res?.error.key == 'buy_gas_pump_unavailable' ? `Pump ${pump.pumpNumber} is not yet available. Try again.` : res?.error.key == 'pay_outside_petrozone_error' ? res.error.partnerApiMessage : 'Failed transaction. Try again.') }, 300) } } }, (error) => { resetFlags() setTimeout(() => { Alert.alert('Error', res?.error.key == 'buy_gas_pump_unavailable' ? `Pump ${pump.pumpNumber} is not yet available. Try again.` : res?.error.key == 'pay_outside_petrozone_error' ? res.error.partnerApiMessage : 'Failed transaction. Try again.') }, 300) }) } const PumpSelectorModalView = () => { return ( {!initiateCancel && !confirmProceed && ( { setInitiateCancel(true) if(initiateProceed) { setInitiateProceed(false) } }}> )} {(!initiateCancel && !initiateProceed && !confirmProceed) && PumpListView(selectedPump)} {(initiateCancel && !initiateProceed && !confirmProceed) && CancelPumpSelectorView()} {(initiateProceed && !initiateCancel && !confirmProceed) && ProceedPumpSelectorView()} {confirmProceed && ConfirmPumpSelectorView()} ) } const CancelPumpSelectorView = () => { return ( <> Are you sure you want to cancel the transaction? { setShowModal(false) setInitiateCancel(false) setInitiateProceed(false) setSelectedPump(null) }} style={{ width: 100, height: 44, margin: 12, backgroundColor: Theme.colors.white, borderColor: Theme.colors.primary, borderWidth: 0.5, alignItems: 'center', justifyContent: 'center', borderRadius: 5 }}> Cancel Transaction { setInitiateCancel(false) selectedPump != null ? setInitiateProceed(true) : setInitiateProceed(false) }} style={{ width: 100, height: 44, margin: 12, backgroundColor: Theme.colors.primary, justifyContent: 'center', alignItems: 'center', borderRadius: 5 }}> Continue Transaction ) } const ProceedPumpSelectorView = () => { let message = selectedPump != null ? `This will process your transaction at Pump ${selectedPump.pumpNumber}.` : "No selected pump." return ( <> {message} Please ensure that this is the correct pump and click Ok below to proceed. { setInitiateCancel(false) setInitiateProceed(false) }} style={{ padding: 10, width: 100, backgroundColor: Theme.colors.primary, justifyContent: 'center', alignItems: 'center', borderRadius: 5 }}> Ok ) } const ConfirmPumpSelectorView = () => { let message = selectedPump != null ? "Processing..." : "No selected pump." return ( <> {/* */} {message} ) } const PumpListView = (currentSelectedPump) => { return ( <> Please select the pump index.toString()} data={props.data.fuelService?.fuelingPoints} scrollEnabled={true} showsVerticalScrollIndicator={false} renderItem={({item, index}) => { let available = item.pumpStatus == "Available" return ( { setInitiateProceed(true) setSelectedPump(item) }} key={index} style={{ alignItems: 'center', justifyContent: 'center', margin: 20 }}> {(currentSelectedPump != null && currentSelectedPump.pumpNumber == item.pumpNumber) ? ( ) : ( )} {item.pumpNumber} ) }} numColumns={2} /> { if(selectedPump != null) { setConfirmProceed(true) initiateTransaction() } }}> Ok ) } const snapPoint = () => { return props.data != null && props.data.fuelService?.fuelProducts != undefined && props.data.fuelService?.fuelProducts.length > 4 ? ['53', '53', '53'] : props.data != null && props.data.fuelService?.fuelProducts == undefined ? ['40', '40', '40'] : ['43', '43', '43'] } return ( { return props.data == null ? null : renderStationDetails(props.data, props.onClick) }} enabledBottomInitialAnimation={true} enabledInnerScrolling={true} initialSnap={0} renderHeader={() => { if(props.data == null) return null return ( {props.data.storeName} {}} activeOpacity={1} style={{top: -25}}> {(props.data && props.data.address != undefined && props.data.address != "") ? } actionSheetTitle="Choose an application to view the route" address={props.data.address} // address to navigate by for all apps waze={{ address: props.data.address, lat:props.data.latitude, lon:props.data.longitude, action: actions.navigateByLatAndLon}} // specific settings for waze googleMaps={{ address: props.data.address, lat:'',lon:'',action: actions.navigateByAddress, travelMode:googleMapsTravelModes.driving}} // specific settings for google maps maps={{ address: props.data.address, lat:'', lon:'',action: actions.navigateByAddress, travelMode:mapsTravelModes.driving}} /> // specific settings for maps : null} Directions ) }}/> ); } const mapStateToProps = (state) => { return { app_theme: state.appThemeReducer.theme } } export default connect(mapStateToProps, null)(PayatpumpStationDetails)