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)