// global.Buffer = require('buffer').Buffer; import React, { useEffect, useRef, useState, useCallback, useMemo } from 'react'; import { Alert, Animated, Keyboard } from 'react-native'; import { TextInput, Button, PermissionsAndroid, StatusBar, StyleSheet, Text, View, Image, TouchableOpacity, ScrollView, FlatList, Dimensions } from 'react-native'; import { launchCamera, launchImageLibrary } from 'react-native-image-picker'; import { SelectList } from 'react-native-dropdown-select-list'; import DatePicker from 'react-native-date-picker'; import AsyncStorage from '@react-native-async-storage/async-storage'; import DocumentPicker from "react-native-document-picker"; import NetInfo from "@react-native-community/netinfo"; import RNFS from 'react-native-fs'; import MapLibreGL from '@maplibre/maplibre-react-native'; import { MapView,ShapeSource,Camera,UserLocation,PointAnnotation,FillLayer,LineLayer,VectorSource } from "@maplibre/maplibre-react-native"; import Moment from 'moment'; import { RadioButton } from 'react-native-paper'; import AwesomeAlert from 'react-native-awesome-alerts'; import RNFetchBlob from 'rn-fetch-blob'; import { PJU_API_URL } from "../../urlConfig"; type collectScreenProps = {route: any,navigation: any}; function CollectScreen({route,navigation}: collectScreenProps) { const apiKey = "JoJs2pcDv5o0yQlQLMfI"; const [basemap, setBasemap] = useState("streets-v2"); const styleURL = `https://api.maptiler.com/maps/${basemap}/style.json?key=${apiKey}`; const {fixCoordinate} = route.params; const [imgUrl, setImgUrl] = useState([]); const [files, setFiles] = useState([]); const [fileDocument, setFileDocument] = useState([]); const [currentIndex, setCurrentIndex] = useState(0); const [connected, setConnected] = useState(true) const openCameraLib = async () => { const result = await launchCamera({ mediaType: 'photo', quality: 1, includeBase64: true, saveToPhotos: true }); const newObj = { file_type: result?.assets![0]?.type, file: result?.assets![0]?.base64, fileSize: result?.assets![0]?.fileSize, } setFiles([...files,newObj]); setImgUrl([...imgUrl,result?.assets![0]?.base64]); }; const openLib = async () => { const result = await launchImageLibrary({ quality: 1, mediaType: 'photo', selectionLimit: 0, includeExtra: true, includeBase64: true }); result?.assets?.forEach(asset => { const newObj = { file_type: asset.type, file: asset.base64, fileSize: asset.fileSize } setFiles([...files,newObj]); setImgUrl(oldArray => [...oldArray,asset.base64]); }); }; const PrevImg = ({isIndex}) => { if(isIndex===0){ return ( ) } return ( { setCurrentIndex(currentIndex-1) ref.current.scrollToIndex({ animated: true, index: currentIndex-1 }); }}> ) }; const NextImg = ({isIndex}) => { if(imgUrl.length<=1){ return ( ) } else{ if (isIndex === (imgUrl.length-1)) { return ( ) } else{ return ( { setCurrentIndex(currentIndex+1) ref.current.scrollToIndex({ animated: true, index: currentIndex+1 }); }}> ) } } }; const PJU_Type = [ {key:'Lampu 20 W', value:'Lampu 20 W'}, {key:'Lampu 15 W', value:'Lampu 15 W'}, {key:'Lampu 10 W', value:'Lampu 10 W'}, {key:'Lampu 5 W', value:'Lampu 5 W'}, ] const ref = useRef(); const [open, setOpen] = useState(false) const [pju_name, setPJUname] = useState(''); const [selectedPJUType, setselectedPJUType] = useState(""); const [pju_info, setPJUinfo] = useState(''); const [checkedStatus, setCheckedStatus] = useState(''); const [install_date, setInstallDate] = useState(new Date()); const momentDate = Moment(install_date).format('YYYY-MM-DD') const [attachmentImgError, setattachmentImgError] = useState(false); const [pjuNameError, setPJUNameError] = useState(false); const [PJUTypeError, setPJUTypeError] = useState(false); const [PJUStatusError, setPJUStatusError] = useState(false); const [PJUInfoError, setPJUInfoError] = useState(false); const [attachmentSuccess, setAttachmentSuccess] = useState(0) useEffect(()=> { navigation.addListener('beforeRemove', (e:any)=> { console.log("Event",e); if (e.data.action.type !== "NAVIGATE"){ e.preventDefault(); Alert.alert( 'Unsave Case', 'There are unsave case. Please chose what you want.', [ { text: 'Ok', onPress: () => navigation.dispatch(e.data.action) }, { text: 'Continue', style: 'cancel' } ] ) } }) const unsubscribe = NetInfo.addEventListener((state) => { setConnected(state.isConnected!) }); return () => { unsubscribe(); }; },[]); const collectDataOnline = async() => { 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: pju_name, jenis: selectedPJUType, tanggal_installasi: momentDate, status: checkedStatus, keterangan: pju_info, geom: `POINT(${fixCoordinate.long} ${fixCoordinate.lat})` }) ).then(async (resp) => { const json = resp.json() const status = resp.respInfo.status; result.status = status; result.body = json; if (status == 201) { insertAttachment(json,files) const storeData = async () => { try { await AsyncStorage.setItem(json[0].id+" / "+pju_name+" / "+selectedPJUType+" / "+momentDate+" / "+checkedStatus+" / "+pju_info+" / "+fixCoordinate.long+" / "+fixCoordinate.lat+" / sentPJU","Value"); } catch (e) { } }; storeData() } }) } catch (error) { } } const collectDataOffline = async() => { const storeData = async () => { try { await AsyncStorage.setItem(pju_name+" / "+selectedPJUType+" / "+momentDate+" / "+checkedStatus+" / "+pju_info+" / "+fixCoordinate.long+" / "+fixCoordinate.lat+" / draftPJU","Value"); } catch (e) { } }; storeData() setAlertOffline(false); navigation.navigate('Survey Penerangan Jalan Umum', { screen: 'Survey Penerangan Jalan Umum'}) } const getMyObject = async () => { try { const jsonValue = await AsyncStorage.getItem('draft') console.log(JSON.parse(jsonValue!)); // return jsonValue != null ? JSON.parse(jsonValue) : null } catch(e) { // read error } } const removeValue = async () => { try { await AsyncStorage.removeItem('Test mobile offline / Lampu 20 W / 2024-11-20 / Baik / - / [object Object] / draftPJU') } catch(e) { // remove error } } const getAllKeys = async () => { // let keys = [] try { const keys = await AsyncStorage.getAllKeys() console.log(keys); } catch(e) { // read key error } // example console.log result: // ['@MyApp_user', '@MyApp_key'] } const insertAttachment = async (json: any,files: any) => { try { files.forEach(async function(file:any) { const url = `${PJU_API_URL}/addAttachment`; await RNFetchBlob.config({ trusty : true }).fetch('POST', url,{ "Content-Type": "application/json", }, JSON.stringify({ pju_id:json[0].id, file:file.file, mimetype:file.file_type, size:file.fileSize}) ).then(async (resp) => { Alert.alert("Success") setAlertOnline(false); navigation.navigate('Survey Penerangan Jalan Umum', { screen: 'Survey Penerangan Jalan Umum'}) } ) }); } catch (error) { console.log(error); } } const uploadFileOnHandler = async () => { try { const pickedFile = await DocumentPicker.pickSingle({ type: [DocumentPicker.types.allFiles], // allowMultiSelection:true }) await RNFS.readFile(pickedFile.uri, 'base64').then(data => { console.log('base64', data); let your_bytes = btoa(data); const newObj = { file_type: pickedFile.type, file: your_bytes } setFiles([...files,newObj]); setFileDocument([...fileDocument,pickedFile]); }); } catch (error) { console.error(error) } } const deleteByIndex = (index:number) => { setFileDocument(oldValues => { return oldValues.filter((_: any, i: number) => i !== index) }) } const [alertOnline, setAlertOnline] = useState(false); const [alertOffline, setAlertOffline] = useState(false); const showDialog = () => { // if (imgUrl.length === 0) { // setattachmentImgError(true); // } // else{ // setattachmentImgError(false); // } if (!pju_name) { setPJUNameError(true); } else{ setPJUNameError(false); } if (!selectedPJUType) { setPJUTypeError(true); } else{ setPJUTypeError(false); } if (!checkedStatus) { setPJUStatusError(true); } else{ setPJUStatusError(false); } if (!pju_info) { setPJUInfoError(true); } else{ setPJUInfoError(false); } if(!pju_name || !pju_info || !selectedPJUType || !checkedStatus) { return false } if(connected){ setAlertOnline(true); } else{ setAlertOffline(true) } }; const handleCancelAlertOnline = () => { setAlertOnline(false); }; const handleCancelAlertOffline = () => { setAlertOffline(false); }; return( Form Survey PJU Image {imgUrl.length === 0 ? currentIndex :currentIndex+1}/{imgUrl.length} { const x = e.nativeEvent.contentOffset.x; setCurrentIndex(parseFloat((x/330).toFixed(0))); }} horizontal renderItem={({item,index}) => { return( ) }} /> {/* Open Camera */} } id={"pjuCoordinate"} coordinate={[fixCoordinate.long, fixCoordinate.lat]} /> navigation.navigate('PJU Map Collect', { screen: 'PJU Map Collect'})}> Change Location Name* { setPJUname(text) }} onChange={()=> { setPJUNameError(false) }} /> {pjuNameError ? Name is Required!:null} PJU Type * ( [setPJUTypeError(false)] )} /> {PJUTypeError ? PJU Type is Required!:null} Status * {setCheckedStatus('Baik'); setPJUStatusError(false)}} /> Baik {setCheckedStatus('Rusak'); setPJUStatusError(false); }} /> Rusak {PJUStatusError ? Status is Required!:null} Information * { setPJUinfo(text) }} onChange={()=> { setPJUInfoError(false) }} /> {PJUInfoError ? Information is Required!:null} Installation Date setOpen(true)} value={String(momentDate)} /> { setOpen(false) setInstallDate(survey_date) }} onCancel={() => { setOpen(false) }} />