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.
287 lines
13 KiB
287 lines
13 KiB
import { RefreshControl } from 'react-native'; |
|
import { |
|
TextInput, |
|
StatusBar, |
|
StyleSheet, |
|
Text, |
|
View, |
|
Image, |
|
ScrollView, |
|
} from 'react-native'; |
|
import AsyncStorage from '@react-native-async-storage/async-storage'; |
|
import {useIsFocused} from '@react-navigation/native'; |
|
import { useCallback, useEffect, useState } from 'react'; |
|
import AwesomeAlert from 'react-native-awesome-alerts'; |
|
import NetInfo from "@react-native-community/netinfo"; |
|
import { MenuProvider } from 'react-native-popup-menu'; |
|
import { |
|
Menu, |
|
MenuOptions, |
|
MenuOption, |
|
MenuTrigger, |
|
} from 'react-native-popup-menu'; |
|
type sendListDataProps = {route: any,navigation: any}; |
|
function SentListPermit({route,navigation}: sendListDataProps) { |
|
const [refreshing, setRefreshing] = useState(false); |
|
const onRefresh = useCallback(() => { |
|
setRefreshing(true); |
|
setTimeout(() => { |
|
setRefreshing(false); |
|
}, 2000); |
|
}, []); |
|
const [localStorage, setLocalStorage] = useState([]); |
|
const [filterData, setFilterData] = useState([]); |
|
const [alertOffline, setAlertOffline] = useState(false); |
|
const [connected, setConnected] = useState(true) |
|
const deleteById = (name:string) => { |
|
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 getDataPermit = async () => { |
|
setLocalStorage([]) |
|
try { |
|
const jsonValue = await AsyncStorage.getAllKeys() |
|
if(jsonValue.length != 0) { |
|
jsonValue.map((item) => { |
|
if(item != "USER_DATA" && item != "my-jwt"){ |
|
let splited = item.split(" / "); |
|
if(splited.length === 6){ |
|
const objectItem = { |
|
id:splited[0], |
|
company_name:splited[1], |
|
permit_status:splited[2], |
|
location:splited[3], |
|
geom:splited[4].split(",") |
|
} |
|
console.log("aaa",objectItem); |
|
|
|
if(splited[5] === 'sentPermit'){ |
|
setLocalStorage(oldArray => [...oldArray,objectItem]) |
|
} |
|
} |
|
|
|
} |
|
}) |
|
} |
|
} catch (error) { |
|
|
|
} |
|
|
|
}; |
|
const isFocused = useIsFocused(); |
|
useEffect(() => { |
|
if(isFocused){ |
|
getDataPermit() |
|
const unsubscribe = NetInfo.addEventListener((state) => { |
|
setConnected(state.isConnected!) |
|
}); |
|
return () => { |
|
unsubscribe(); |
|
}; |
|
}; |
|
},[isFocused]) |
|
const [draftData, setDraftData] = useState(0); |
|
navigation.addListener('beforeRemove', (e:any)=> { |
|
}) |
|
const [stringFilter,setStingFilter] = useState('') |
|
const handleSearch = (text:string) => { |
|
const formattedQuery = text.toLowerCase(); |
|
const filteredData = localStorage.filter((data:any) => |
|
data.case_name.toLowerCase().includes(formattedQuery) |
|
) |
|
setFilterData(filteredData) |
|
}; |
|
const optionsStyles = { |
|
optionsContainer: { |
|
alignItems: 'flex-start', |
|
justifyContent: 'center', |
|
width:100, |
|
marginVertical:-10, |
|
marginLeft:-10, |
|
backgroundColor: '#FFFFFF', |
|
borderRadius: 5, |
|
shadowColor: '#00000040', |
|
shadowOffset: { |
|
width: 0, |
|
height: 2, |
|
}, |
|
borderColor:'#6B5E5E4D', |
|
borderWidth:1, |
|
shadowOpacity: 0.2, |
|
shadowRadius: 6, |
|
elevation: 5, |
|
}, |
|
optionText: { |
|
color: 'brown', |
|
}, |
|
}; |
|
return( |
|
<View style={styles.mainContainer}> |
|
<StatusBar backgroundColor="#34A6F8" barStyle={'light-content'} /> |
|
<View key={"mainBackground"} style={{backgroundColor:'#34A6F8',width:'100%',height:'93%'}} /> |
|
<View key={"background"} style={{backgroundColor:'#FFFFFF',width:'100%',height:'100%',position:'absolute',borderTopRightRadius:50,borderTopLeftRadius:35,marginTop:10}}> |
|
<View key={"Filter"} style={{paddingLeft:30,paddingTop:30,paddingRight:30,marginTop:10}}> |
|
<TextInput |
|
style={{ |
|
height: 40, |
|
// borderWidth: 1, |
|
padding: 10, |
|
borderRadius: 50, |
|
color: 'black', |
|
backgroundColor:'#e6e3e3' |
|
}} |
|
inlineImageLeft="search" |
|
inlineImagePadding={20} |
|
placeholderTextColor={'#6B5E5E'} |
|
placeholder='Search' |
|
onChangeText={queryText => {handleSearch(queryText),setStingFilter(queryText)}} |
|
defaultValue={stringFilter} |
|
/> |
|
</View> |
|
<ScrollView |
|
style={{ |
|
padding: 30 |
|
}} |
|
refreshControl={ |
|
<RefreshControl refreshing={refreshing} /> |
|
} |
|
> |
|
{ |
|
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:14,color:'#000000',fontWeight:'600',padding:5}}>Company Name</Text> |
|
<Text style={{fontSize:14,color:'#000000',fontWeight:'600',padding:5}}>Permit Status</Text> |
|
<Text style={{fontSize:14,color:'#000000',fontWeight:'600',padding:5}}>Location</Text> |
|
</View> |
|
<View style={{ flexDirection:'column',paddingLeft:0,width:'65%'}}> |
|
<Text style={{fontSize:14,fontWeight:'400',color:'#000000',padding:5}}>: {item.company_name}</Text> |
|
<Text style={{fontSize:14,fontWeight:'400',color:'#000000',padding:5}}>: {item.permit_status}</Text> |
|
<Text style={{fontSize:14,fontWeight:'400',color:'#000000',padding:5}}>: {item.location}</Text> |
|
</View> |
|
<View style={{ marginLeft:'55%',marginTop:0,width:150,height:100,position:'absolute'}}> |
|
<MenuProvider skipInstanceCheck={true} style={{flexDirection:'column'}}> |
|
<Menu> |
|
<MenuTrigger> |
|
<Image |
|
style={{justifyContent:'center',alignSelf:'flex-end'}} |
|
source={require('../../assets/icon/Actions.png')} |
|
resizeMode='cover' |
|
/> |
|
</MenuTrigger> |
|
<MenuOptions customStyles={optionsStyles}> |
|
<MenuOption |
|
onSelect={()=>{ |
|
navigation.navigate('Permit Editing',{ screen: 'Edit',data: { |
|
id:item.id, |
|
company_name:item.company_name, |
|
permit_status:item.permit_status, |
|
location:item.location, |
|
}}); |
|
}} |
|
children={ |
|
<View style={{flexDirection:'row',alignItems:'center',justifyContent:'center'}}> |
|
<Image source={require('../../assets/icon/edit.png')} /> |
|
<Text style={{marginLeft:10,color:'#6B5E5EB2',fontSize:14,fontWeight:400}}>Edit</Text> |
|
</View>} |
|
/> |
|
<View style={{marginVertical: 5, width:85, |
|
marginHorizontal: 2, |
|
borderBottomWidth: 1, |
|
borderColor: '#ccc'}} |
|
/> |
|
<MenuOption |
|
onSelect={()=> { |
|
deleteById(item.company_name); |
|
removeValue(item.id+" / "+item.company_name+" / "+item.permit_status+" / "+item.location+" / "+item.geom+" / sentPermit"); |
|
}} |
|
children={ |
|
<View style={{flexDirection:'row',alignItems:'center',justifyContent:'center'}}> |
|
<Image source={require('../../assets/icon/dell.png')} /> |
|
<Text style={{marginLeft:10,color:'#6B5E5EB2',fontSize:14,fontWeight:400}}>Delete</Text> |
|
</View> |
|
} |
|
/> |
|
</MenuOptions> |
|
</Menu> |
|
</MenuProvider> |
|
</View> |
|
</View> |
|
<View |
|
style={{ |
|
marginTop: 10, |
|
marginBottom: 10, |
|
borderBottomColor: '#E2E2E2', |
|
borderBottomWidth: 2, |
|
}} |
|
/> |
|
</View> |
|
)) |
|
: |
|
<View style={{alignItems:'center',padding:20}}> |
|
<Text style={{fontSize:16,color:'grey'}}>Data Kosong</Text> |
|
</View> |
|
} |
|
|
|
</ScrollView> |
|
</View> |
|
|
|
<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}} |
|
/> |
|
</View> |
|
); |
|
}; |
|
const styles = StyleSheet.create({ |
|
container: { |
|
flex: 1, |
|
backgroundColor: '#ecf0f1', |
|
padding: 10, |
|
}, |
|
mainContainer: { |
|
flex: 1, |
|
}, |
|
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 SentListPermit; |