You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
646 lines
29 KiB
646 lines
29 KiB
import { Alert, Animated, Keyboard, RefreshControl } from 'react-native'; |
|
import { |
|
TextInput, |
|
Button, |
|
PermissionsAndroid, |
|
StatusBar, |
|
StyleSheet, |
|
Text, |
|
View, |
|
Image, |
|
TouchableOpacity, |
|
ScrollView, |
|
FlatList, |
|
Dimensions |
|
} from 'react-native'; |
|
|
|
import {useNavigation,NavigationContainer,useIsFocused} from '@react-navigation/native'; |
|
import {createNativeStackNavigator} from '@react-navigation/native-stack'; |
|
|
|
import AsyncStorage from '@react-native-async-storage/async-storage'; |
|
import { useCallback, useEffect, useState } from 'react'; |
|
import { width } from '@fortawesome/free-solid-svg-icons/faMugSaucer'; |
|
import { SelectList } from 'react-native-dropdown-select-list'; |
|
import { PDAM_API_URL, PERMIT_API_URL, PJU_API_URL } from '../../urlConfig'; |
|
import AwesomeAlert from 'react-native-awesome-alerts'; |
|
import NetInfo from "@react-native-community/netinfo"; |
|
import Moment from 'moment'; |
|
import RNFetchBlob from 'rn-fetch-blob'; |
|
|
|
type sendListDataProps = {route: any,navigation: any}; |
|
function DraftListScreen({route,navigation}: sendListDataProps) { |
|
const survey_Type = [ |
|
{key:'PJU', value:'PJU'}, |
|
{key:'PERMIT', value:'PERMIT'}, |
|
{key:'PDAM', value:'PDAM'}, |
|
] |
|
const [selectedSurveyType, setselectedSurveyType] = useState(""); |
|
const [refreshing, setRefreshing] = useState(false); |
|
const onRefresh = useCallback(() => { |
|
setRefreshing(true); |
|
setTimeout(() => { |
|
setRefreshing(false); |
|
}, 2000); |
|
}, []); |
|
const [localStorage, setLocalStorage] = useState([]); |
|
const [filterData, setFilterData] = useState([]); |
|
const [surveyType, setSurveyType] = useState(""); |
|
const [alertOffline, setAlertOffline] = useState(false); |
|
const [connected, setConnected] = useState(true) |
|
const storeData = async (value:any) => { |
|
// console.log("key",value.case_name) |
|
|
|
try { |
|
const jsonValue = JSON.stringify(value); |
|
await AsyncStorage.setItem(String(value.case_id)+" / "+String(value.case_name)+" / "+String(value.case_category)+" / "+"3PA-01"+" / "+String(value.case_risk),jsonValue); |
|
} catch (e) { |
|
// saving error |
|
} |
|
}; |
|
const multiSet = async () => { |
|
const firstPair = [1, "value_1"] |
|
const secondPair = [2, "value_2"] |
|
try { |
|
const objCase1 = JSON.stringify({id:1,case_name:"test1"}) |
|
const objCase2 = JSON.stringify({id:2,case_name:"test2"}) |
|
await AsyncStorage.multiSet([["case_1",objCase1],["case_2",objCase2]]) |
|
} catch(e) { |
|
//save error |
|
} |
|
|
|
// console.log("Done.") |
|
} |
|
const deleteById = (name:string) => { |
|
if(selectedSurveyType==="PJU"){ |
|
setLocalStorage(oldValues => { |
|
return oldValues.filter((local_data:any) => local_data.pju_name !== name) |
|
}) |
|
} |
|
if(selectedSurveyType==="PDAM"){ |
|
setLocalStorage(oldValues => { |
|
return oldValues.filter((local_data:any) => local_data.pipe_name !== name) |
|
}) |
|
} |
|
if(selectedSurveyType==="PERMIT"){ |
|
setLocalStorage(oldValues => { |
|
return oldValues.filter((local_data:any) => local_data.company_name !== name) |
|
}) |
|
} |
|
} |
|
const removeValue = async (key:string) => { |
|
try { |
|
// console.log("keyDelete",key); |
|
await AsyncStorage.removeItem(key) |
|
// await getCount(); |
|
} catch(e) { |
|
} |
|
} |
|
const selectSurveyType = () => { |
|
// console.log(selectedSurveyType); |
|
if(selectedSurveyType==='PJU'){ |
|
getDataPJU() |
|
} |
|
if(selectedSurveyType==='PDAM'){ |
|
getDataPDAM() |
|
} |
|
if(selectedSurveyType==='PERMIT'){ |
|
getDataPermit() |
|
} |
|
} |
|
const getDataPJU = async () => { |
|
setLocalStorage([]) |
|
try { |
|
const jsonValue = await AsyncStorage.getAllKeys() |
|
// console.log("All Key",jsonValue) |
|
if(jsonValue.length != 0) { |
|
jsonValue.map((item) => { |
|
if(item != "USER_DATA" && item != "my-jwt"){ |
|
let splited = item.split(" / "); |
|
const objectItem = { |
|
pju_name:splited[0], |
|
pju_type:splited[1], |
|
installation_date:splited[2], |
|
status:splited[3], |
|
keterangan:splited[4], |
|
long:splited[5], |
|
lat:splited[6] |
|
} |
|
// console.log(objectItem); |
|
|
|
if(splited[7] === 'draftPJU'){ |
|
setLocalStorage(oldArray => [...oldArray,objectItem]) |
|
} |
|
} |
|
}) |
|
} |
|
} catch (e) { |
|
// error reading value |
|
} |
|
}; |
|
const getDataPDAM = async () => { |
|
setLocalStorage([]) |
|
try { |
|
const jsonValue = await AsyncStorage.getAllKeys() |
|
// console.log("All Key",jsonValue.length) |
|
if(jsonValue.length != 0) { |
|
jsonValue.map((item) => { |
|
if(item != "USER_DATA" && item != "my-jwt"){ |
|
let splited = item.split(" / "); |
|
if(splited.length === 7){ |
|
const objectItem = { |
|
pipe_name:splited[0], |
|
pipe_type:splited[1], |
|
installation_date:splited[2], |
|
status:splited[3], |
|
keterangan:splited[4], |
|
geom:splited[5].split(",") |
|
} |
|
// console.log(objectItem); |
|
|
|
if(splited[6] === 'draftPDAM'){ |
|
setLocalStorage(oldArray => [...oldArray,objectItem]) |
|
} |
|
} |
|
|
|
} |
|
}) |
|
} |
|
} catch (error) { |
|
|
|
} |
|
} |
|
const getDataPermit = async () => { |
|
setLocalStorage([]) |
|
try { |
|
const jsonValue = await AsyncStorage.getAllKeys() |
|
console.log("All Key",jsonValue) |
|
if(jsonValue.length != 0) { |
|
jsonValue.map((item) => { |
|
if(item != "USER_DATA" && item != "my-jwt"){ |
|
let splited = item.split(" / "); |
|
console.log(splited.length); |
|
|
|
if(splited.length === 5){ |
|
const objectItem = { |
|
company_name:splited[0], |
|
permit_status:splited[1], |
|
location:splited[2], |
|
geom:splited[3].split(",") |
|
} |
|
// console.log(objectItem); |
|
|
|
if(splited[4] === 'draftPermit'){ |
|
setLocalStorage(oldArray => [...oldArray,objectItem]) |
|
} |
|
} |
|
|
|
} |
|
}) |
|
} |
|
} catch (error) { |
|
|
|
} |
|
} |
|
const isFocused = useIsFocused(); |
|
useEffect(() => { |
|
if(isFocused){ |
|
const unsubscribe = NetInfo.addEventListener((state) => { |
|
setConnected(state.isConnected!) |
|
}); |
|
return () => { |
|
unsubscribe(); |
|
}; |
|
}; |
|
},[isFocused]) |
|
const [draftData, setDraftData] = useState(0); |
|
navigation.addListener('beforeRemove', (e:any)=> { |
|
// Alert.alert(String(draftData)) |
|
|
|
// route.params.onGoBack(draftData); |
|
}) |
|
const getCount = async () => { |
|
try { |
|
const jsonValue = await AsyncStorage.getAllKeys() |
|
let index = 0; |
|
jsonValue.map((item) => { |
|
if(item != "USER_DATA" && item != "my-jwt"){ |
|
let splited = item.split(" / "); |
|
if(splited[4] === 'draftPJU'){ |
|
index+=1 |
|
} |
|
} |
|
setDraftData(index) |
|
}) |
|
} catch (e) { |
|
} |
|
}; |
|
const [stringFilter,setStingFilter] = useState('') |
|
const handleSearch = (text:string) => { |
|
// console.log(text); |
|
|
|
const formattedQuery = text.toLowerCase(); |
|
const filteredData = localStorage.filter(data => |
|
data.case_name.toLowerCase().includes(formattedQuery) |
|
) |
|
setFilterData(filteredData) |
|
|
|
}; |
|
const getDataAll = async () => { |
|
try { |
|
const jsonValue = await AsyncStorage.getAllKeys() |
|
// console.log("All",jsonValue) |
|
// return jsonValue != null ? JSON.parse(jsonValue) : null; |
|
} catch (e) { |
|
// error reading value |
|
} |
|
}; |
|
const getDataItem = async () => { |
|
try { |
|
const jsonValue = await AsyncStorage.getItem("120 / test1 / Structure Damage Missing / SDM-1 / 1. High") |
|
// console.log("pure",jsonValue) |
|
return jsonValue != null ? JSON.parse(jsonValue) : null; |
|
} catch (e) { |
|
// error reading value |
|
} |
|
}; |
|
const getMultiple = async () => { |
|
try { |
|
await AsyncStorage.removeItem("141 / Case 1 / Structure Damage Missing / SDM-01 / 2. Medium / draft") |
|
} catch(e) { |
|
} |
|
} |
|
const reSend = async (data:any) => { |
|
if(connected){ |
|
if(selectedSurveyType==="PJU"){ |
|
try { |
|
const result = { |
|
status: 0, |
|
body: {}, |
|
} |
|
await RNFetchBlob.config({ |
|
trusty : true |
|
}).fetch('POST', `${PJU_API_URL}/addData`,{ |
|
"Accept": 'application/json', |
|
"Content-Type": "application/json", |
|
}, |
|
JSON.stringify({ |
|
nama: data.nama, |
|
jenis: data.jenis, |
|
tanggal_installasi: data.date, |
|
status: data.status, |
|
keterangan: data.keterangan, |
|
geom: `POINT(${data.long} ${data.lat})` |
|
}) |
|
).then(async (resp) => { |
|
const status = resp.respInfo.status |
|
if (status == 201) { |
|
deleteById(data.nama); |
|
removeValue(data.nama+" / "+data.jenis+" / "+data.date+" / "+data.status+" / "+data.keterangan+" / "+data.long+" / "+data.lat+" / draftPJU"); |
|
} |
|
else { |
|
Alert.alert("Internal Server Error") |
|
} |
|
}) |
|
} catch (error) { |
|
Alert.alert("Internal Server Error") |
|
} |
|
} |
|
if(selectedSurveyType==="PDAM"){ |
|
try { |
|
const obj = { |
|
nama: data.nama, |
|
jenis: data.jenis, |
|
tanggal_installasi: data.date, |
|
status: data.status, |
|
keterangan: data.keterangan, |
|
geom: `MULTILINESTRING((${data.geom}))` |
|
}; |
|
await RNFetchBlob.config({ |
|
trusty : true |
|
}).fetch('POST', `${PDAM_API_URL}/addData`,{ |
|
"Content-Type": "application/json", |
|
}, |
|
JSON.stringify(obj) |
|
).then(async(resp) => { |
|
const json = resp.json(); |
|
const status = resp.respInfo.status |
|
if (status == 201) { |
|
deleteById(data.nama); |
|
removeValue(data.nama+" / "+data.jenis+" / "+data.date+" / "+data.status+" / "+data.keterangan+" / "+data.geom+" / draftPDAM"); |
|
} |
|
else { |
|
Alert.alert("Internal Server Error") |
|
} |
|
}) |
|
} catch (error) { |
|
Alert.alert("Internal Server Error"); |
|
} |
|
|
|
} |
|
if(selectedSurveyType==="PERMIT"){ |
|
try { |
|
const obj = { |
|
company_name: data.company_name, |
|
location: data.location, |
|
permit_status: data.permit_status, |
|
geom: `MULTIPOLYGON (((${data.geom},${String(data.geom).split(",")[0]})))` |
|
} |
|
await RNFetchBlob.config({ |
|
trusty : true |
|
}).fetch('POST', `${PERMIT_API_URL}/addData`,{ |
|
"Content-Type": "application/json", |
|
}, |
|
JSON.stringify(obj) |
|
).then(async(resp) => { |
|
const json = await resp.json(); |
|
const status = resp.respInfo.status; |
|
if (status == 201) { |
|
deleteById(data.company_name); |
|
removeValue(data.company_name+" / "+data.permit_status+" / "+data.location+" / "+data.geom+" / draftPermit"); |
|
} |
|
else { |
|
Alert.alert("Internal Server Error") |
|
} |
|
}) |
|
} catch (error) { |
|
Alert.alert("Internal Server Error") |
|
} |
|
|
|
} |
|
} |
|
else{ |
|
setAlertOffline(true) |
|
} |
|
} |
|
return( |
|
<View style={styles.mainContainer}> |
|
{/* <RefreshControl refreshing={refreshing} onRefresh={onRefresh} /> */} |
|
{/* <TextInput |
|
style={styles.input} |
|
placeholder='Search' |
|
onChangeText={queryText => {handleSearch(queryText),setStingFilter(queryText)}} |
|
/> */} |
|
<SelectList |
|
search={false} |
|
placeholder="Select Survey Type" |
|
boxStyles={{borderRadius:50,borderWidth:2,borderColor:'black'}} |
|
inputStyles={{color:'black'}} |
|
dropdownTextStyles={{color:'black'}} |
|
data={survey_Type} |
|
setSelected={setselectedSurveyType} |
|
onSelect={selectSurveyType} |
|
/> |
|
<ScrollView style={styles.container} |
|
refreshControl={ |
|
<RefreshControl refreshing={refreshing} onRefresh={onRefresh} /> |
|
}> |
|
{selectedSurveyType=="PJU" && localStorage.length != 0? |
|
localStorage.map((item:any,index:number) => ( |
|
<View key={index}> |
|
<View style={{flexDirection:'row'}}> |
|
<View style={{ flexDirection:'column',paddingLeft:0,width:'35%'}}> |
|
<Text style={{fontSize:16,color:'black'}}>Nama JPU</Text> |
|
<Text style={{fontSize:16,color:'black'}}>Jenis</Text> |
|
<Text style={{fontSize:16,color:'black'}}>Tanggal Installasi</Text> |
|
<Text style={{fontSize:16,color:'black'}}>Status</Text> |
|
</View> |
|
<View style={{ flexDirection:'column',paddingLeft:0,width:'45%'}}> |
|
<Text style={{fontSize:16,fontWeight:'bold',color:'black'}}>: {item.pju_name}</Text> |
|
<Text style={{fontSize:16,fontWeight:'bold',color:'black'}}>: {item.pju_type}</Text> |
|
<Text style={{fontSize:16,fontWeight:'bold',color:'black'}}>: {item.installation_date}</Text> |
|
<Text style={{fontSize:16,fontWeight:'bold',color:'black'}}>: {item.status}</Text> |
|
</View> |
|
<View style={{flexDirection:'column',width:'20%'}}> |
|
<View style={{}}> |
|
<View> |
|
<TouchableOpacity onPress={()=> { |
|
deleteById(item.pju_name); |
|
removeValue(item.pju_name+" / "+item.pju_type+" / "+item.installation_date+" / "+item.status+" / "+item.keterangan+" / "+item.long+" / "+item.lat+" / draftPJU"); |
|
}}> |
|
<View style={{flexDirection:'row',justifyContent:'flex-end',padding:6}}> |
|
<Image |
|
source={require('../../assets/icon/delete.png')} |
|
style={{width:25,height:25}} |
|
/> |
|
{/* <Text style={{fontSize:18,fontWeight:'bold'}}>View</Text> */} |
|
</View> |
|
</TouchableOpacity> |
|
</View> |
|
</View> |
|
<View style={{}}> |
|
<View> |
|
<TouchableOpacity onPress={()=> {reSend({ |
|
nama:item.pju_name, |
|
jenis:item.pju_type, |
|
date:Moment(new Date(item.installation_date)).format('YYYY-MM-DD'), |
|
status:item.status, |
|
keterangan:item.keterangan, |
|
long:item.long, |
|
lat:item.lat |
|
})}}> |
|
<View style={{flexDirection:'row',justifyContent:'flex-end',padding:6}}> |
|
<Image |
|
source={require('../../assets/icon/send.png')} |
|
style={{width:25,height:25}} |
|
/> |
|
{/* <Text style={{fontSize:18,fontWeight:'bold'}}>View</Text> */} |
|
</View> |
|
</TouchableOpacity> |
|
</View> |
|
</View> |
|
</View> |
|
</View> |
|
<View |
|
style={{ |
|
marginTop: 10, |
|
marginBottom: 10, |
|
borderBottomColor: 'black', |
|
borderBottomWidth: 1, |
|
}} |
|
/> |
|
</View> |
|
)) |
|
: |
|
selectedSurveyType=="PDAM" && localStorage.length != 0 ? |
|
localStorage.map((item:any,index:number) => ( |
|
<View key={index}> |
|
<View style={{flexDirection:'row'}}> |
|
<View style={{ flexDirection:'column',paddingLeft:0,width:'35%'}}> |
|
<Text style={{fontSize:16,color:'black'}}>Nama Pipa</Text> |
|
<Text style={{fontSize:16,color:'black'}}>Jenis</Text> |
|
<Text style={{fontSize:16,color:'black'}}>Tanggal Installasi</Text> |
|
<Text style={{fontSize:16,color:'black'}}>Status</Text> |
|
</View> |
|
<View style={{ flexDirection:'column',paddingLeft:0,width:'45%'}}> |
|
<Text style={{fontSize:16,fontWeight:'bold',color:'black'}}>: {item.pipe_name}</Text> |
|
<Text style={{fontSize:16,fontWeight:'bold',color:'black'}}>: {item.pipe_type}</Text> |
|
<Text style={{fontSize:16,fontWeight:'bold',color:'black'}}>: {item.installation_date}</Text> |
|
<Text style={{fontSize:16,fontWeight:'bold',color:'black'}}>: {item.status}</Text> |
|
</View> |
|
<View style={{flexDirection:'column',width:'20%'}}> |
|
<View style={{}}> |
|
<View> |
|
<TouchableOpacity onPress={()=> { |
|
deleteById(item.pipe_name); |
|
removeValue(item.pipe_name+" / "+item.pipe_type+" / "+item.installation_date+" / "+item.status+" / "+item.keterangan+" / "+item.geom+" / draftPDAM"); |
|
}}> |
|
<View style={{flexDirection:'row',justifyContent:'flex-end',padding:6}}> |
|
<Image |
|
source={require('../../assets/icon/delete.png')} |
|
style={{width:25,height:25}} |
|
/> |
|
</View> |
|
</TouchableOpacity> |
|
</View> |
|
</View> |
|
<View style={{}}> |
|
<View> |
|
<TouchableOpacity onPress={()=> {reSend({ |
|
nama:item.pipe_name, |
|
jenis:item.pipe_type, |
|
date:Moment(new Date(item.installation_date)).format('YYYY-MM-DD'), |
|
status:item.status, |
|
keterangan:item.keterangan, |
|
geom:item.geom |
|
})}}> |
|
<View style={{flexDirection:'row',justifyContent:'flex-end',padding:6}}> |
|
<Image |
|
source={require('../../assets/icon/send.png')} |
|
style={{width:25,height:25}} |
|
/> |
|
{/* <Text style={{fontSize:18,fontWeight:'bold'}}>View</Text> */} |
|
</View> |
|
</TouchableOpacity> |
|
</View> |
|
</View> |
|
</View> |
|
</View> |
|
<View |
|
style={{ |
|
marginTop: 10, |
|
marginBottom: 10, |
|
borderBottomColor: 'black', |
|
borderBottomWidth: 1, |
|
}} |
|
/> |
|
</View> |
|
)) |
|
: |
|
selectedSurveyType=="PERMIT" && localStorage.length != 0 ? |
|
localStorage.map((item:any,index:number) => ( |
|
<View key={index}> |
|
<View style={{flexDirection:'row'}}> |
|
<View style={{ flexDirection:'column',paddingLeft:0,width:'35%'}}> |
|
<Text style={{fontSize:16,color:'black'}}>Company Name</Text> |
|
<Text style={{fontSize:16,color:'black'}}>Permit Status</Text> |
|
<Text style={{fontSize:16,color:'black'}}>Location</Text> |
|
</View> |
|
<View style={{ flexDirection:'column',paddingLeft:0,width:'45%'}}> |
|
<Text style={{fontSize:16,fontWeight:'bold',color:'black'}}>: {item.company_name}</Text> |
|
<Text style={{fontSize:16,fontWeight:'bold',color:'black'}}>: {item.permit_status}</Text> |
|
<Text style={{fontSize:16,fontWeight:'bold',color:'black'}}>: {item.location}</Text> |
|
</View> |
|
<View style={{flexDirection:'column',width:'20%'}}> |
|
<View style={{}}> |
|
<View> |
|
<TouchableOpacity onPress={()=> { |
|
deleteById(item.company_name); |
|
removeValue(item.company_name+" / "+item.permit_status+" / "+item.location+" / "+item.geom+" / draftPermit"); |
|
}}> |
|
<View style={{flexDirection:'row',justifyContent:'flex-end',padding:6}}> |
|
<Image |
|
source={require('../../assets/icon/delete.png')} |
|
style={{width:25,height:25}} |
|
/> |
|
</View> |
|
</TouchableOpacity> |
|
</View> |
|
</View> |
|
<View style={{}}> |
|
<View> |
|
<TouchableOpacity onPress={()=> {reSend({ |
|
company_name:item.company_name, |
|
permit_status:item.permit_status, |
|
location:item.location, |
|
geom:item.geom |
|
})}}> |
|
<View style={{flexDirection:'row',justifyContent:'flex-end',padding:6}}> |
|
<Image |
|
source={require('../../assets/icon/send.png')} |
|
style={{width:25,height:25}} |
|
/> |
|
{/* <Text style={{fontSize:18,fontWeight:'bold'}}>View</Text> */} |
|
</View> |
|
</TouchableOpacity> |
|
</View> |
|
</View> |
|
</View> |
|
</View> |
|
<View |
|
style={{ |
|
marginTop: 10, |
|
marginBottom: 10, |
|
borderBottomColor: 'black', |
|
borderBottomWidth: 1, |
|
}} |
|
/> |
|
</View> |
|
)) |
|
: |
|
<View style={{alignItems:'center',padding:20}}> |
|
<Text style={{fontSize:16,color:'grey'}}>Data Kosong</Text> |
|
</View> |
|
} |
|
</ScrollView> |
|
<AwesomeAlert |
|
show={alertOffline} |
|
showProgress={false} |
|
title="You are offline" |
|
message="You need connection for Resend Data." |
|
closeOnTouchOutside={false} |
|
closeOnHardwareBackPress={false} |
|
showConfirmButton={true} |
|
confirmText="Ok" |
|
confirmButtonColor="#DD6B55" |
|
onConfirmPressed={() => { |
|
setAlertOffline(false); |
|
}} |
|
overlayStyle={{width:'100%'}} |
|
contentContainerStyle={{width:'70%',borderRadius:10}} |
|
titleStyle={{fontSize:20}} |
|
messageStyle={{fontSize:16}} |
|
/> |
|
{/* <Button onPress={getDataAll} title='GetDataByKey'/> */} |
|
</View> |
|
); |
|
} |
|
|
|
const styles = StyleSheet.create({ |
|
container: { |
|
flex: 1, |
|
backgroundColor: '#ecf0f1', |
|
padding: 10, |
|
}, |
|
mainContainer: { |
|
flex: 1, |
|
padding: 10, |
|
}, |
|
title: { |
|
alignItems: 'center', |
|
justifyContent: 'center', |
|
alignSelf: 'center', |
|
fontWeight: 'bold', |
|
fontSize: 22, |
|
color: 'black', |
|
marginBottom: 10 |
|
}, |
|
input: { |
|
height: 40, |
|
borderWidth: 1, |
|
padding: 10, |
|
borderRadius: 50, |
|
color: 'black' |
|
}, |
|
}); |
|
|
|
export default DraftListScreen; |