farhantock
7 months ago
9 changed files with 0 additions and 354 deletions
@ -1,24 +0,0 @@ |
|||||||
import React from "react"; |
|
||||||
import { Alert, CloseIcon, HStack, IconButton, Text, Toast, ToastDescription, ToastTitle, useToast, VStack } from "@gluestack-ui/themed"; |
|
||||||
|
|
||||||
const CustomToast = ({ |
|
||||||
id, |
|
||||||
status, |
|
||||||
variant, |
|
||||||
title, |
|
||||||
description, |
|
||||||
isClosable, |
|
||||||
...rest |
|
||||||
}) => { |
|
||||||
const toast = useToast(); |
|
||||||
return ( |
|
||||||
<Toast nativeID={"toast-" + id} action={status ? status : "info"} variant={variant ? variant : "accent"}> |
|
||||||
<VStack space="xs"> |
|
||||||
{ title ? <ToastTitle>{title}</ToastTitle> : null } |
|
||||||
{ description ? <ToastDescription>{description}</ToastDescription> : null } |
|
||||||
</VStack> |
|
||||||
</Toast> |
|
||||||
) |
|
||||||
} |
|
||||||
|
|
||||||
export default CustomToast; |
|
@ -1,15 +0,0 @@ |
|||||||
import React from "react"; |
|
||||||
import { View } from "react-native"; |
|
||||||
|
|
||||||
const HorizontalLine = ({width, borderStyle}) => { |
|
||||||
return <View style={{ |
|
||||||
borderBottomWidth: 1, |
|
||||||
minWidth: width ? width : 25, |
|
||||||
flex: 1, |
|
||||||
alignSelf: 'center', |
|
||||||
borderColor: '#d9d8d7', |
|
||||||
borderStyle: borderStyle ? borderStyle : 'solid' |
|
||||||
}}></View> |
|
||||||
} |
|
||||||
|
|
||||||
export default HorizontalLine; |
|
@ -1,11 +0,0 @@ |
|||||||
import React from "react" |
|
||||||
import { Box, Text } from "@gluestack-ui/themed" |
|
||||||
import { strings } from "../utils/i18n" |
|
||||||
|
|
||||||
export const NoDataContent = () => { |
|
||||||
return ( |
|
||||||
<Box flex={1} alignItems='center' my="$1/2"> |
|
||||||
<Text color="red">{strings('global.noData')}</Text> |
|
||||||
</Box> |
|
||||||
) |
|
||||||
} |
|
@ -1,144 +0,0 @@ |
|||||||
import { Box, HStack, Heading, Text } from '@gluestack-ui/themed' |
|
||||||
import { VStack } from '@gluestack-ui/themed' |
|
||||||
import React from 'react' |
|
||||||
import { strings } from '../utils/i18n' |
|
||||||
import VerticalLine from './VerticalLine' |
|
||||||
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; |
|
||||||
import { colorStatusDecider, dropPointLocationRenderer } from '../utils/general' |
|
||||||
import { Image, ScrollView } from 'react-native' |
|
||||||
import { TouchableOpacity } from 'react-native-gesture-handler' |
|
||||||
import { store } from '../appredux/store' |
|
||||||
import { setSelectedHistoryPicture, setSelectedHistoryPictures, setShowHistoryPicture } from '../appredux/actions' |
|
||||||
|
|
||||||
export const RenderDeliveryOrder = ({data}) => { |
|
||||||
if (data && data.length > 0) { |
|
||||||
return data.map((item, idx) => { |
|
||||||
return ( |
|
||||||
<VStack key={idx}> |
|
||||||
<Text _dark={{ color: "$textLight200" }} fontSize="$md"> |
|
||||||
{strings('label.dropPointLocations')} |
|
||||||
</Text> |
|
||||||
|
|
||||||
<RenderDropPoint data={item.drop_point} /> |
|
||||||
</VStack> |
|
||||||
) |
|
||||||
}) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
export const PointConnector = () => { |
|
||||||
return ( |
|
||||||
<HStack py={4}> |
|
||||||
<VStack w='20%' alignItems='center' alignSelf='center'> |
|
||||||
<VerticalLine /> |
|
||||||
</VStack> |
|
||||||
<VStack w='80%'></VStack> |
|
||||||
</HStack> |
|
||||||
) |
|
||||||
} |
|
||||||
|
|
||||||
export const RenderDropPoint = ({data}) => { |
|
||||||
if (data && data.length > 0) { |
|
||||||
return data.map((item, idx) => { |
|
||||||
return ( |
|
||||||
<VStack key={idx}> |
|
||||||
<HStack py={4}> |
|
||||||
<VStack w='20%' alignItems='center' alignSelf='center'> |
|
||||||
<MaterialCommunityIcons |
|
||||||
name="map-marker" |
|
||||||
color={colorStatusDecider(item)} |
|
||||||
size={30} |
|
||||||
/> |
|
||||||
</VStack> |
|
||||||
<VStack w='80%'> |
|
||||||
<Heading
|
|
||||||
style={{color: colorStatusDecider(item)}} |
|
||||||
size="sm"> |
|
||||||
{dropPointLocationRenderer(item, 'name')} |
|
||||||
</Heading> |
|
||||||
<Text |
|
||||||
style={{color: colorStatusDecider(item)}} |
|
||||||
fontSize="$sm"> |
|
||||||
{dropPointLocationRenderer(item, 'address')} |
|
||||||
</Text> |
|
||||||
|
|
||||||
{item.status === 'completed' || item.status === 'cancel' ? |
|
||||||
<RenderDropPointPictures data={item.attachments} />
|
|
||||||
: null |
|
||||||
} |
|
||||||
|
|
||||||
{item.status === 'completed' || item.status === 'cancel' ? |
|
||||||
<RenderDropPointSignature data={item.signatures} />
|
|
||||||
: null |
|
||||||
} |
|
||||||
|
|
||||||
{item.status === 'completed' || item.status === 'cancel' ? |
|
||||||
<Box mt={5}> |
|
||||||
<Text bold>{strings('global.notes')}:</Text> |
|
||||||
<Text>{item.driver_notes && item.driver_notes !== '' ? item.driver_notes : '-'}</Text> |
|
||||||
</Box> |
|
||||||
: null |
|
||||||
} |
|
||||||
|
|
||||||
</VStack> |
|
||||||
</HStack> |
|
||||||
{ idx !== data.length - 1 ? <PointConnector /> : null} |
|
||||||
</VStack> |
|
||||||
) |
|
||||||
}) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
export const RenderDropPointPictures = ({data}) => { |
|
||||||
return ( |
|
||||||
<VStack mt={10}> |
|
||||||
<Box> |
|
||||||
<Text bold>{strings('history.dropPointPictures')}</Text> |
|
||||||
</Box> |
|
||||||
<ScrollView horizontal={true} showsHorizontalScrollIndicator={false}> |
|
||||||
{ data && data.length > 0 ? data.map((item, idx) => ( |
|
||||||
<TouchableOpacity key={idx} onPress={() => { |
|
||||||
store.dispatch(setSelectedHistoryPicture(item)) |
|
||||||
store.dispatch(setShowHistoryPicture(true)) |
|
||||||
}}> |
|
||||||
<Box pr={5}> |
|
||||||
<Image
|
|
||||||
idx={idx} |
|
||||||
source={{uri: item}} |
|
||||||
height={100} |
|
||||||
width={120} |
|
||||||
/> |
|
||||||
</Box> |
|
||||||
</TouchableOpacity> |
|
||||||
)) : <Text>-</Text> } |
|
||||||
</ScrollView> |
|
||||||
</VStack> |
|
||||||
) |
|
||||||
} |
|
||||||
|
|
||||||
export const RenderDropPointSignature = ({data}) => { |
|
||||||
return ( |
|
||||||
<VStack mt={10}> |
|
||||||
<Box> |
|
||||||
<Text bold>{strings('history.signaturePicture')}</Text> |
|
||||||
</Box> |
|
||||||
<ScrollView horizontal={true} showsHorizontalScrollIndicator={false}> |
|
||||||
{ data && data.length > 0 ? data.map((item, idx) => ( |
|
||||||
<TouchableOpacity key={idx} onPress={() => { |
|
||||||
store.dispatch(setSelectedHistoryPicture(item)) |
|
||||||
store.dispatch(setShowHistoryPicture(true)) |
|
||||||
}}> |
|
||||||
<Box pr={5}> |
|
||||||
<Image
|
|
||||||
idx={idx} |
|
||||||
source={{uri: item}} |
|
||||||
height={150} |
|
||||||
width={120} |
|
||||||
/> |
|
||||||
</Box> |
|
||||||
</TouchableOpacity> |
|
||||||
)) : <Text>-</Text> } |
|
||||||
</ScrollView> |
|
||||||
</VStack> |
|
||||||
) |
|
||||||
} |
|
@ -1,13 +0,0 @@ |
|||||||
import React from "react"; |
|
||||||
import { View } from "react-native"; |
|
||||||
|
|
||||||
const VerticalLine = ({height}) => { |
|
||||||
return <View style={{ |
|
||||||
borderWidth: 0.2, |
|
||||||
minHeight: height ? height : 10, |
|
||||||
borderColor: 'grey', |
|
||||||
// borderStyle: 'dashed'
|
|
||||||
}}></View> |
|
||||||
} |
|
||||||
|
|
||||||
export default VerticalLine; |
|
@ -1,20 +0,0 @@ |
|||||||
|
|
||||||
import { deleteRow, dropTable, insertTable, selectRow } from './index'; |
|
||||||
|
|
||||||
const TABLE_NAME = 'ospod_photo'; |
|
||||||
|
|
||||||
export const storePhoto = (user_id, drop_point_id, image_uri, image_blob, lat, lon) => { |
|
||||||
insertTable(TABLE_NAME, [user_id, drop_point_id, image_uri, image_blob, lat, lon]) |
|
||||||
} |
|
||||||
|
|
||||||
export const deletePhoto = (row_id, callback) => { |
|
||||||
deleteRow(TABLE_NAME, row_id, (deleted) => callback(deleted)) |
|
||||||
} |
|
||||||
|
|
||||||
export const selectAllPhoto = (callback) => { |
|
||||||
selectRow(TABLE_NAME, null, (data) => callback(data)) |
|
||||||
} |
|
||||||
|
|
||||||
export const dropTablePhoto = (callback) => { |
|
||||||
dropTable(TABLE_NAME, (dropped) => callback(dropped)) |
|
||||||
} |
|
@ -1,52 +0,0 @@ |
|||||||
import React from "react"; |
|
||||||
import CustomToast from "../components/CustomToast"; |
|
||||||
import { createContext, useContext, useRef } from "react"; |
|
||||||
import Toast, { BaseToast, ErrorToast } from "react-native-toast-message"; |
|
||||||
import { View, Text } from 'react-native' |
|
||||||
|
|
||||||
const renderTypeToast = (type) => { |
|
||||||
let bgColor = 'muted.600' |
|
||||||
if (type) { |
|
||||||
if (type === 'success') { |
|
||||||
bgColor = 'green.600'; |
|
||||||
} |
|
||||||
else if (type === 'error') { |
|
||||||
bgColor = 'red.600'; |
|
||||||
} |
|
||||||
else if (type === 'warning') { |
|
||||||
bgColor = 'yellow.600'; |
|
||||||
} |
|
||||||
} |
|
||||||
return bgColor; |
|
||||||
} |
|
||||||
|
|
||||||
export const toastr = { |
|
||||||
show: (message, type, duration = 5000) => { |
|
||||||
return ( |
|
||||||
<CustomToast |
|
||||||
// title="Something went wrong"
|
|
||||||
description={message} |
|
||||||
variant="accent" |
|
||||||
isClosable={true} |
|
||||||
status={type} |
|
||||||
bg={renderTypeToast(type)} |
|
||||||
/> |
|
||||||
) |
|
||||||
}, |
|
||||||
}; |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export const toastConfig = { |
|
||||||
success: ({ text1, props }) => ( |
|
||||||
<View style={{ width: '80%', backgroundColor: 'green', borderRadius: 10, padding: 10, marginBottom: 35}}> |
|
||||||
<Text style={{ color: '#ffffff', fontSize: 14 }}>{text1}</Text> |
|
||||||
</View> |
|
||||||
), |
|
||||||
|
|
||||||
error: ({ text1, props }) => ( |
|
||||||
<View style={{ width: '80%', backgroundColor: 'red', borderRadius: 10, padding: 10, marginBottom: 35}}> |
|
||||||
<Text style={{ color: '#ffffff', fontSize: 14 }}>{text1}</Text> |
|
||||||
</View> |
|
||||||
) |
|
||||||
}; |
|
@ -1,37 +0,0 @@ |
|||||||
import { color_cancel, color_complete, color_on_progress, color_open } from "../config/Styles"; |
|
||||||
|
|
||||||
export const EMPTY_DATE = ["1900-01-01 00:00:00", null, ""]; |
|
||||||
export const DATE_FORMAT = "D MMMM YYYY HH:mm"; |
|
||||||
|
|
||||||
export const dropPointLocationRenderer = (data, key) => { |
|
||||||
let spatial_type = data.spatial_type; |
|
||||||
let output = '-'; |
|
||||||
let key_ = 'transitpoint_'+key; |
|
||||||
if (spatial_type === 'pool') { |
|
||||||
key_ = 'pool_'+key; |
|
||||||
output = data?.join?.[key_]; |
|
||||||
} |
|
||||||
else if (spatial_type === 'transit_point') { |
|
||||||
key_ = 'transitpoint_'+key; |
|
||||||
output = data?.join?.[key_]; |
|
||||||
} |
|
||||||
else if (spatial_type === 'geofence') { |
|
||||||
key_ = 'geofence_'+key; |
|
||||||
output = data?.join?.[key_]; |
|
||||||
} |
|
||||||
|
|
||||||
// validate to put -
|
|
||||||
if (output == "") { |
|
||||||
output = "-" |
|
||||||
} |
|
||||||
|
|
||||||
return output; |
|
||||||
} |
|
||||||
|
|
||||||
export const colorStatusDecider = (item) => { |
|
||||||
if (!item) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
// return item.status === "open" || EMPTY_DATE.includes(item.in_time) ? color_open : item.status === "on-progress" ? color_on_progress : color_complete
|
|
||||||
return item.status === "open" ? color_open : item.status === "on-progress" ? color_on_progress : item.status === "completed" ? color_complete : color_cancel; |
|
||||||
} |
|
@ -1,38 +0,0 @@ |
|||||||
import { setSelectedDropPoint, setShipmentData } from "../appredux/actions"; |
|
||||||
import { store } from "../appredux/store"; |
|
||||||
import ApiShipment from "../services/api/shipment"; |
|
||||||
|
|
||||||
|
|
||||||
export const getShipmentData = async () => { |
|
||||||
const shipment = await ApiShipment.searchDetail('open,on-progress'); |
|
||||||
if (shipment && shipment.status === true && shipment.data) { |
|
||||||
if (shipment.data.length > 0) { |
|
||||||
return shipment.data[0]; |
|
||||||
} |
|
||||||
else { |
|
||||||
return null; |
|
||||||
} |
|
||||||
} |
|
||||||
else { |
|
||||||
return null; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
// this function is to update shipmentData and selectedDropPoint state in redux based on current selectedDropPoint
|
|
||||||
// flow -> get API then update redux state
|
|
||||||
export const updateShipmentState = (dp_item, callback) => { |
|
||||||
let promiseSave = new Promise((resolve, reject) => { |
|
||||||
let shipment = getShipmentData(); |
|
||||||
resolve(shipment); |
|
||||||
}) |
|
||||||
promiseSave.then(val => { |
|
||||||
let doIdx = val.delivery_order.findIndex(x => parseInt(x.id) === parseInt(dp_item.delivery_order)); |
|
||||||
let dpIdx = val.delivery_order[doIdx].drop_point.findIndex(x => parseInt(x.id) === parseInt(dp_item.id)); |
|
||||||
let updatedDp = val.delivery_order[doIdx].drop_point[dpIdx]; |
|
||||||
store.dispatch(setShipmentData(val)); |
|
||||||
store.dispatch(setSelectedDropPoint(null)); |
|
||||||
store.dispatch(setSelectedDropPoint(updatedDp)) |
|
||||||
callback(updatedDp) |
|
||||||
}) |
|
||||||
} |
|
Loading…
Reference in new issue