Browse Source

Remove unused file

master
farhantock 7 months ago
parent
commit
08036c128b
  1. BIN
      src/assets/images/check.png
  2. 385
      src/screens/DeliveryPictures.js
  3. 309
      src/screens/ShipmentDigital.js

BIN
src/assets/images/check.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

385
src/screens/DeliveryPictures.js

@ -1,385 +0,0 @@
import { Actionsheet, ActionsheetBackdrop, ActionsheetContent, ActionsheetDragIndicator, ActionsheetDragIndicatorWrapper, Box, Button, ButtonText, Text, VStack } from '@gluestack-ui/themed';
import React, { useEffect, useMemo, useState } from 'react';
import { Alert, Dimensions, FlatList, Image as ImageRN, PermissionsAndroid, Pressable, RefreshControl, ScrollView, StyleSheet, View } from 'react-native';
import { launchCamera } from 'react-native-image-picker';
import Toast from 'react-native-toast-message';
import { useDispatch, useSelector } from 'react-redux';
import { selectRow } from '../services/sqlite';
import { deletePhoto, storePhoto } from '../services/sqlite/ospod_photo';
import { getCoords } from '../utils/geolocation';
import { strings } from '../utils/i18n';
import ImageMarker, { Position, TextBackgroundType } from 'react-native-image-marker';
import RNFS from 'react-native-fs';
import { DATE_FORMAT } from '../utils/general';
import moment from 'moment';
import { requestAccessStoragePermission } from '../utils/storage';
const numColumns = 3
const DeliveryPicturesScreen = () => {
const { user } = useSelector(state => state.userReducer)
const { selectedDropPoint } = useSelector(state => state.shipmentReducer)
const [photos, setPhotos] = useState([])
const [selectedPhoto, setSelectedPhoto] = useState(null)
const [showActionsheet, setShowActionsheet] = useState(false)
const [refreshing, setRefreshing] = useState(false)
const [capturedImage, setCapturedImage] = useState(null);
useEffect(() => {
if (selectedDropPoint) {
reloadPhotos()
}
}, [])
useEffect(() => {
if (selectedPhoto) {
handleToggleActionSheet();
}
}, [selectedPhoto])
useEffect(() => {
if (!showActionsheet) {
setSelectedPhoto(null)
}
}, [showActionsheet])
const formatData = (data, numColumns) => {
const numberOfFullRows = Math.floor(data.length / numColumns);
let numberOfElementsLastRow = data.length - (numberOfFullRows * numColumns);
while (numberOfElementsLastRow !== numColumns && numberOfElementsLastRow !== 0) {
data.push({ key: `blank-${numberOfElementsLastRow}`, empty: true });
numberOfElementsLastRow++;
}
return data;
};
const reloadPhotos = () => {
setRefreshing(true)
selectRow('ospod_photo', { "drop_point_id": selectedDropPoint.id }, (rows) => {
setPhotos(rows);
setRefreshing(false)
})
}
const openCamera = async () => {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.CAMERA,
{
title: strings('takePicture.cameraPermissionTitle'),
message: strings('takePicture.cameraPermissionMessage'),
buttonNeutral: strings('takePicture.cameraPermissionBtnNeutral'),
buttonNegative: strings('takePicture.cameraPermissionBtnCancel'),
buttonPositive: strings('takePicture.cameraPermissionBtnPositive'),
},
);
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
// console.log('You can use the camera');
handleLaunchCamera()
} else {
// console.log('Camera permission denied');
}
} catch (err) {
console.warn(err);
}
}
const handleLaunchCamera = () => {
let options = {
storageOptions: {
skipBackup: true,
path: 'images',
},
cameraType: 'back',
maxWidth: 768,
maxHeight: 1024,
saveToPhotos: false,
includeBase64: true
};
launchCamera(options, (response) => {
if (response.didCancel) {
// console.log('User cancelled image picker');
} else if (response.error) {
// console.log('ImagePicker Error: ', response.error);
} else if (response.customButton) {
// console.log('User tapped custom button: ', response.customButton);
// alert(response.customButton);
} else {
// console.log('response', response);
// response:
// {
// "assets": [
// {
// "base64": "/9j/4QBqRXhpZgAATU0AKgAAAAgABAEAAAQAAAABAAAEAAEBAAQ......"
// "fileName": "rn_image_picker_lib_temp_f5afd4ec-a31b-4854-8dc7-5c5dd750e3c6.jpg",
// "fileSize": 595470,
// "height": 1024,
// "originalPath": "file:///data/user/0/com.integrasiautama.ospodduta/cache/rn_image_picker_lib_temp_f5afd4ec-a31b-4854-8dc7-5c5dd750e3c6.jpg",
// "type": "image/jpeg",
// "uri": "file:///data/user/0/com.integrasiautama.ospodduta/cache/rn_image_picker_lib_temp_10e0c170-69ce-4a1d-8520-82f75945c125.jpg",
// "width": 768
// }
// ]
// }
if (response.assets && response.assets.length > 0) {
setRefreshing(true)
let user_id = user?.id;
getCoords(loc => {
// console.log('loc', loc)
if (loc) {
let imageObject = {
"user_id": user_id,
"drop_point_id": selectedDropPoint?.id,
"image_uri": response.assets[0].uri,
"image_blob": response.assets[0].base64,
"lat": loc.lat,
"lon": loc.lon
}
addOverlay(imageObject)
// addOverlayAndSave(imageObject);
// storePhoto(imageObject.user_id, imageObject.drop_point_id, imageObject.image_uri, imageObject.image_blob, imageObject.lat, imageObject.lon)
// storePhoto(user_id, selectedDropPoint?.id, response.assets[0].uri, response.assets[0].base64, loc.lat, loc.lon)
// reloadPhotos();
}
else {
setRefreshing(false)
}
})
}
}
});
}
const addOverlay = async (imageObject) => {
try {
const timestamp = new Date().toLocaleString();
const location = { latitude: imageObject.lat, longitude: imageObject.lon }; // Replace with actual coordinates
const overlayText = `${timestamp}\nLatitude: ${location.latitude}\nLongitude: ${location.longitude}`;
// console.log('[addOverlay] imageObject.image_uri', imageObject.image_uri)
if (imageObject.image_uri) {
const markedImage = await ImageMarker.markText({
backgroundImage: {
src: {uri: imageObject.image_uri}
},
watermarkTexts: [{
text: overlayText,
positionOptions: {
position: Position.bottomLeft,
},
style: {
color: '#ffffff',
fontSize: 8,
fontName: 'Arial',
// shadowStyle: {
// dx: 10,
// dy: 10,
// radius: 10,
// color: '#008F6D',
// },
textBackgroundStyle: {
padding: 10,
type: TextBackgroundType.none,
color: '#00000080'
}
},
}],
position: 'bottomLeft',
color: '#ffffff',
fontName: 'Arial-BoldMT',
fontSize: 16,
scale: 1,
});
// console.log('[addOverlay] markedImage: ', markedImage)
// Save the marked image to the temporary folder
await saveToTemporaryFolder(markedImage, imageObject);
}
} catch (error) {
console.error('Error adding overlay:', error);
setRefreshing(false)
}
}
const saveToTemporaryFolder = async (markedImage, imageObject) => {
try {
const tempPath = `file://${RNFS.TemporaryDirectoryPath}/drop_point_${imageObject.drop_point_id}_${moment().format('YYYYMMDDHHmmss')}.jpg`;
if (!requestAccessStoragePermission()) {
setRefreshing(false)
return;
}
await RNFS.copyFile(markedImage, tempPath);
const imageBase64 = await RNFS.readFile(tempPath, 'base64');
// Image is now saved in the temporary directory
// console.log('Image saved to temporary folder:', tempPath);
// setCapturedImage(tempPath);
storePhoto(imageObject.user_id, imageObject.drop_point_id, tempPath, imageBase64, imageObject.lat, imageObject.lon)
reloadPhotos();
// setRefreshing(false)
} catch (error) {
console.error('Error saving image to temporary folder:', error);
setRefreshing(false)
}
}
const handlePressImage = (item) => {
setSelectedPhoto(item);
}
const handleToggleActionSheet = () => {
setShowActionsheet(!showActionsheet)
}
const handleDeletePhoto = () => {
Alert.alert(
strings('takePicture.deletePhoto'),
strings('takePicture.confirmDelete'),
[
{ text: strings('global.no') },
{
text: strings('global.yes'), onPress: async () => {
if (selectedPhoto) {
deletePhoto(selectedPhoto?.id, (deleted) => {
if (deleted) {
Toast.show({ type: 'success', text1: strings('takePicture.successDeletePhoto') })
setShowActionsheet(false)
reloadPhotos()
}
else {
Toast.show({ type: 'error', text1: strings('takePicture.failedDeletePhoto') })
}
})
}
}
}
]
);
}
const renderItem = ({ item, index }) => {
if (item.empty === true) {
return <View style={[styles.item, styles.itemInvisible]} />;
}
return (
<Pressable
style={({ pressed }) => [{ opacity: pressed ? 0.5 : 1, flex: 1, aspectRatio: 1, padding: 1 }]}
onPress={() => handlePressImage(item)}
>
<ImageRN style={{ flex: 1 }} resizeMode='cover' source={{ uri: item.image_uri }} />
</Pressable>
);
};
const NoImageContent = () => {
return (
<Box flex={1} alignItems='center' my="$1/2">
<Text>{strings('takePicture.noImage')}</Text>
</Box>
)
}
const ImageGrid = useMemo(() => {
if (photos.length < 1) {
return (
<ScrollView
refreshControl={
<RefreshControl
refreshing={refreshing}
onRefresh={reloadPhotos}
/>
}
>
<NoImageContent />
</ScrollView>
)
}
else {
return (
<FlatList
refreshControl={<RefreshControl
refreshing={refreshing}
onRefresh={reloadPhotos}
/>}
data={formatData(photos, numColumns)}
renderItem={renderItem}
numColumns={numColumns}
/>
)
}
}, [photos, refreshing])
return (
<Box style={styles.container}>
<Box flex={1}>
{ImageGrid}
<Box mx={10} my={15}>
<Button
onPress={openCamera}
h={50}
action="primary"
>
<ButtonText color="#FFFFFF">{strings('takePicture.takePhoto').toUpperCase()}</ButtonText>
</Button>
</Box>
<Actionsheet isOpen={showActionsheet} onClose={handleToggleActionSheet} zIndex={999}>
<ActionsheetBackdrop />
<ActionsheetContent zIndex={999}>
<ActionsheetDragIndicatorWrapper>
<ActionsheetDragIndicator />
</ActionsheetDragIndicatorWrapper>
<VStack space='xs'>
<Box>
<ImageRN style={{ height: Dimensions.get('window').height - 120, width: Dimensions.get('window').width - 50 }} resizeMode='contain' source={{ uri: selectedPhoto?.image_uri }} />
</Box>
<Box>
<Button
onPress={handleDeletePhoto}
h={50}
action="negative"
>
<ButtonText color="#FFFFFF">{strings('takePicture.deletePhoto').toUpperCase()}</ButtonText>
</Button>
</Box>
</VStack>
</ActionsheetContent>
</Actionsheet>
</Box>
</Box>
)
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#FAFAFA'
},
item: {
backgroundColor: '#4D243D',
alignItems: 'center',
justifyContent: 'center',
flex: 1,
margin: 1,
height: Dimensions.get('window').width / numColumns, // approximate a square
},
itemInvisible: {
backgroundColor: 'transparent',
}
})
export default DeliveryPicturesScreen

309
src/screens/ShipmentDigital.js

@ -1,309 +0,0 @@
import { Box, HStack, Text, VStack } from '@gluestack-ui/themed';
import Barcode from '@kichiyaki/react-native-barcode-generator';
import React, { useEffect, useMemo, useState } from 'react';
import { Dimensions, Image as ImageRN, RefreshControl, ScrollView, StyleSheet } from 'react-native';
import { useDispatch, useSelector } from 'react-redux';
import DUTATRANS_LOGO from '../assets/images/dutatrans_logo.jpeg';
import moment from 'moment';
import { dropPointLocationRenderer } from '../utils/general';
const ShipmentDigitalScreen = ({navigation}) => {
const dispatch = useDispatch()
const [showActionsheet, setShowActionsheet] = useState(false)
const {shipmentData, selectedDropPoint} = useSelector(state => state.shipmentReducer)
const {user} = useSelector(state => state.userReducer)
const [refreshing, setRefreshing] = useState(false);
useEffect(() => {
// onRefresh();
console.log('shipmentData', JSON.stringify(shipmentData))
}, [])
const onRefresh = () => {
// setRefreshing(true);
}
const RenderShipmentOrigin = useMemo(() => {
let dropPoints = [];
if (shipmentData && shipmentData.delivery_order && shipmentData.delivery_order.length > 0) {
for (let i=0; i < shipmentData.delivery_order.length; i++) {
if (shipmentData.delivery_order[i].drop_point && shipmentData.delivery_order[i].drop_point.length > 0) {
for (let j=0; j < shipmentData.delivery_order[i].drop_point.length; j++) {
dropPoints.push(shipmentData.delivery_order[i].drop_point[j]);
}
}
}
}
if (dropPoints.length > 0) {
dropPoints.pop()
}
return (
<Box borderStyle='solid' borderWidth={1} alignItems='center' p={4} minHeight={60}>
<VStack>
{ dropPoints && dropPoints.length > 0 ?
dropPoints.map((item, idx) => {
if (idx === 0) {
return <Text>{dropPointLocationRenderer(item, 'name')}</Text>
}
else {
return <Text></Text>
}
})
: null
}
</VStack>
</Box>
)
}, [shipmentData])
const RenderShipmentDestinations = useMemo(() => {
let dropPoints = [];
if (shipmentData && shipmentData.delivery_order && shipmentData.delivery_order.length > 0) {
for (let i=0; i < shipmentData.delivery_order.length; i++) {
if (shipmentData.delivery_order[i].drop_point && shipmentData.delivery_order[i].drop_point.length > 0) {
for (let j=0; j < shipmentData.delivery_order[i].drop_point.length; j++) {
dropPoints.push(shipmentData.delivery_order[i].drop_point[j]);
}
}
}
}
if (dropPoints.length > 0) {
dropPoints.shift()
}
return (
<Box borderStyle='solid' borderWidth={1} alignItems='center' p={4} minHeight={60}>
<VStack>
{ dropPoints && dropPoints.length > 0 ?
dropPoints.map((item, idx) =>
<Text>{`${dropPointLocationRenderer(item, 'name')}`}</Text>
)
: null
}
</VStack>
</Box>
)
}, [shipmentData])
const RenderProducts = useMemo(() => {
let dropPoints = [];
if (shipmentData && shipmentData.delivery_order && shipmentData.delivery_order.length > 0) {
for (let i=0; i < shipmentData.delivery_order.length; i++) {
if (shipmentData.delivery_order[i].drop_point && shipmentData.delivery_order[i].drop_point.length > 0) {
for (let j=0; j < shipmentData.delivery_order[i].drop_point.length; j++) {
dropPoints.push(shipmentData.delivery_order[i].drop_point[j]);
}
}
}
}
if (dropPoints.length > 0) {
dropPoints.shift()
}
return (
<Box borderStyle='solid' borderWidth={1} alignItems='center' p={4} minHeight={60}>
<VStack>
{ dropPoints && dropPoints.length > 0 ?
dropPoints.map((item, idx) =>
<Text>{item.product && item.product !== "" ? item.product : "-"}</Text>
)
: null
}
</VStack>
</Box>
)
}, [shipmentData])
const RenderQuantity = useMemo(() => {
let dropPoints = [];
if (shipmentData && shipmentData.delivery_order && shipmentData.delivery_order.length > 0) {
for (let i=0; i < shipmentData.delivery_order.length; i++) {
if (shipmentData.delivery_order[i].drop_point && shipmentData.delivery_order[i].drop_point.length > 0) {
for (let j=0; j < shipmentData.delivery_order[i].drop_point.length; j++) {
dropPoints.push(shipmentData.delivery_order[i].drop_point[j]);
}
}
}
}
if (dropPoints.length > 0) {
dropPoints.shift()
}
return (
<Box borderStyle='solid' borderWidth={1} alignItems='center' p={4} minHeight={60}>
<VStack>
{ dropPoints && dropPoints.length > 0 ?
dropPoints.map((item, idx) =>
<Text>{item.weight ? item.weight === 0 ? '-' : item.weight : '-'}</Text>
)
: null
}
</VStack>
</Box>
)
}, [shipmentData])
return (
<Box style={styles.container}>
<Box bgColor='#FAFAFA'flex={1}>
<ScrollView
refreshControl={
<RefreshControl
refreshing={refreshing}
onRefresh={onRefresh}
/>
}
>
<ScrollView horizontal>
<HStack space='md'>
<VStack>
<Box>
<ImageRN
style={{width: 150, height: 40}}
source={DUTATRANS_LOGO}
/>
</Box>
<VStack>
<Text size='xs' fontSize={8}>Jl. Flores III Blok C3 No. 1 Kav. 63</Text>
<Text size='xs' fontSize={8}>Cibitung</Text>
<Text size='xs' fontSize={8}>Telp: 021-89981622 Fax: 021-89981621</Text>
</VStack>
</VStack>
<VStack>
<Box px={10}>
<Barcode
format="CODE39"
value={shipmentData?.shipment_internal !== "" ? shipmentData.shipment_internal : shipmentData.shipment_number}
text={shipmentData?.shipment_internal !== "" ? shipmentData.shipment_internal : shipmentData.shipment_number}
maxWidth={Dimensions.get('window').width / 2}
/>
</Box>
</VStack>
</HStack>
</ScrollView>
<VStack my={20}>
<Text textAlign='center' underline bold>SURAT PERINTAH KERJA</Text>
</VStack>
<VStack>
<Text>Kepada Yth,</Text>
<Text>DUTA LOGISTINDO UTAMA</Text>
</VStack>
<VStack display='flex' alignItems='flex-end' mb={20}>
<HStack space='sm'>
<VStack>
<Text>No. Polisi</Text>
<Text>Nama Sopir</Text>
</VStack>
<VStack>
<Text>:</Text>
<Text>:</Text>
</VStack>
<VStack>
<Text>{shipmentData?.license_plate}</Text>
<Text>{shipmentData?.driver_name}</Text>
</VStack>
</HStack>
</VStack>
<ScrollView horizontal>
<HStack>
<VStack>
<Box borderStyle='solid' borderWidth={1} alignItems='center' p={4}>
<Text>Dari</Text>
</Box>
{/* {shipmentData && shipmentData.delivery_order && shipmentData.delivery_order.length > 0 && shipmentData.delivery_order[0].drop_point && shipmentData.delivery_order[0].drop_point.length > 0 ?
<Box borderStyle='solid' borderWidth={1} alignItems='center' p={4} minHeight={60}>
<Text>{ dropPointLocationRenderer(shipmentData.delivery_order[0].drop_point[0], 'name') }</Text>
</Box>
: null
} */}
{ RenderShipmentOrigin }
</VStack>
<VStack>
<Box borderStyle='solid' borderWidth={1} alignItems='center' p={4}>
<Text>Tujuan</Text>
</Box>
{ RenderShipmentDestinations }
</VStack>
<VStack>
<Box borderStyle='solid' borderWidth={1} alignItems='center' p={4}>
<Text>Produk</Text>
</Box>
{ RenderProducts }
</VStack>
<VStack>
<Box borderStyle='solid' borderWidth={1} alignItems='center' p={4}>
<Text>Quantity</Text>
</Box>
{ RenderQuantity }
</VStack>
</HStack>
</ScrollView>
<VStack>
<HStack space='sm'>
<VStack>
<Text size="xs">Putih</Text>
<Text size="xs">Kuning</Text>
<Text size="xs">Merah</Text>
<Text size="xs">Biru</Text>
</VStack>
<VStack>
<Text size="xs">:</Text>
<Text size="xs">:</Text>
<Text size="xs">:</Text>
<Text size="xs">:</Text>
</VStack>
<VStack>
<Text size="xs">Driver</Text>
<Text size="xs">Kasir</Text>
<Text size="xs">Operasional</Text>
<Text size="xs">File</Text>
</VStack>
</HStack>
</VStack>
<VStack display='flex' alignItems='flex-end'>
<HStack space='sm'>
<VStack>
<Text>Cibitung, {shipmentData?.shipment_date ? moment(shipmentData.shipment_date).format('DD-MMM-YY') : null}</Text>
<Text>Operasional</Text>
</VStack>
</HStack>
</VStack>
</ScrollView>
</Box>
</Box>
)
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#FAFAFA',
padding: 10
}
})
export default ShipmentDigitalScreen
Loading…
Cancel
Save