feat(order): deliveryboy details added dynamically

This commit is contained in:
Atanu Das 2026-07-22 14:49:55 +05:30
parent da1feb91e4
commit 8c443d76eb
6 changed files with 63 additions and 40 deletions

View File

@ -4,4 +4,5 @@ export interface OrderStatusTimelineProps {
tracking?: TrackingEntry[]; tracking?: TrackingEntry[];
currentStatus: OrderStatus; currentStatus: OrderStatus;
styles?: any; // optional component uses its own internal styles via useAppTheme styles?: any; // optional component uses its own internal styles via useAppTheme
deliveryPartner?: { name: string; phone: string; }
} }

View File

@ -102,6 +102,7 @@ export const OrderStatusTimeline: React.FC<OrderStatusTimelineProps> = ({
tracking = [], tracking = [],
currentStatus, currentStatus,
styles: propStyles, styles: propStyles,
deliveryPartner,
}) => { }) => {
const { colors } = useAppTheme(); const { colors } = useAppTheme();
const localStyles = getStyles(colors); const localStyles = getStyles(colors);
@ -118,11 +119,11 @@ export const OrderStatusTimeline: React.FC<OrderStatusTimelineProps> = ({
}; };
const handleCall = () => { const handleCall = () => {
Linking.openURL('tel:+919876543210'); Linking.openURL(`tel:${deliveryPartner?.phone}`);
}; };
const handleMessage = () => { const handleMessage = () => {
Linking.openURL('sms:+919876543210'); Linking.openURL(`sms:${deliveryPartner?.phone}`);
}; };
const trackingMap = tracking.reduce<Record<string, string>>((acc, t) => { const trackingMap = tracking.reduce<Record<string, string>>((acc, t) => {
@ -273,13 +274,13 @@ export const OrderStatusTimeline: React.FC<OrderStatusTimelineProps> = ({
<View style={localStyles.driverSection}> <View style={localStyles.driverSection}>
<View style={localStyles.driverInfoRow}> <View style={localStyles.driverInfoRow}>
<View style={localStyles.driverAvatarContainer}> <View style={localStyles.driverAvatarContainer}>
<Text style={localStyles.driverAvatarText}>RS</Text> <Text style={localStyles.driverAvatarText}>{deliveryPartner?.name?.substring(0, 2)?.toUpperCase()}</Text>
</View> </View>
<View style={localStyles.driverMeta}> <View style={localStyles.driverMeta}>
<Text style={localStyles.driverRoleText}>Your Delivery Hero</Text> <Text style={localStyles.driverRoleText}>Your Delivery Hero</Text>
<Text style={localStyles.driverNameText}>Rahul Sharma</Text> <Text style={localStyles.driverNameText}>{deliveryPartner?.name}</Text>
<Text style={localStyles.driverVehicleText}> <Text style={localStyles.driverVehicleText}>
KA-01-AB-1234 Honda Activa {deliveryPartner?.phone}
</Text> </Text>
</View> </View>
<View style={localStyles.ratingBadge}> <View style={localStyles.ratingBadge}>

View File

@ -1,5 +1,5 @@
import React, { useEffect } from 'react'; import React, { useEffect } from 'react';
import { View, Text, ActivityIndicator } from 'react-native'; import { View, Text, ActivityIndicator, Linking } from 'react-native';
import { useNavigation, useRoute, RouteProp } from '@react-navigation/native'; import { useNavigation, useRoute, RouteProp } from '@react-navigation/native';
import { StackNavigationProp } from '@react-navigation/stack'; import { StackNavigationProp } from '@react-navigation/stack';
import { getStyles } from './liveTrackingScreen.styles'; import { getStyles } from './liveTrackingScreen.styles';
@ -52,6 +52,10 @@ export const LiveTrackingScreen: React.FC = () => {
} }
}, [orderStatus, navigation, orderId]); }, [orderStatus, navigation, orderId]);
const handleCall = () => {
Linking.openURL(`tel:${orderDetails?.delivery?.deliveryPartner?.user?.phone}`);
};
if (orderDetailsLoading || !orderDetails) { if (orderDetailsLoading || !orderDetails) {
return ( return (
<View style={styles.container}> <View style={styles.container}>
@ -92,18 +96,18 @@ export const LiveTrackingScreen: React.FC = () => {
} }
style={{ marginBottom: 16 }} style={{ marginBottom: 16 }}
/> />
<Text style={styles.agentName}>Rahul Sharma</Text> <Text style={styles.agentName}>{orderDetails?.delivery?.deliveryPartner?.user?.name}</Text>
<Text style={styles.agentRating}> 4.8</Text> <Text style={styles.agentRating}> 4.8</Text>
<Text style={styles.agentVehicle}>KA-01-AB-1234 Honda Activa</Text> <Text style={styles.agentVehicle}>{orderDetails?.delivery?.deliveryPartner?.user?.phone}</Text>
<View style={styles.agentActions}> <View style={styles.agentActions}>
<PrimaryButton <PrimaryButton
title="Call" title="Call"
onPress={() => {}} onPress={handleCall}
style={{ flex: 1, marginRight: 8 }} style={{ flex: 1, marginRight: 8 }}
/> />
<PrimaryButton <PrimaryButton
title="Message" title="Message"
onPress={() => {}} onPress={() => { }}
style={{ flex: 1, marginLeft: 8 }} style={{ flex: 1, marginLeft: 8 }}
/> />
</View> </View>

View File

@ -21,32 +21,32 @@ type MyOrdersNavProp = CompositeNavigationProp<
>; >;
const TABS = ['All', 'Ongoing', 'Completed']; const TABS = ['All', 'Ongoing', 'Completed'];
const mockOrders = [ // const mockOrders = [
{ // {
id: 'ORD-591283', // id: 'ORD-591283',
providerName: 'Pizza Planet', // providerName: 'Pizza Planet',
providerImage: '', // providerImage: '',
orderDate: '29 Jun 2026', // orderDate: '29 Jun 2026',
status: 'Delivered', // status: 'Delivered',
total: 599, // total: 599,
}, // },
{ // {
id: 'ORD-771239', // id: 'ORD-771239',
providerName: 'Fresh Mart', // providerName: 'Fresh Mart',
providerImage: '', // providerImage: '',
orderDate: '28 Jun 2026', // orderDate: '28 Jun 2026',
status: 'Ongoing', // status: 'Ongoing',
total: 349, // total: 349,
}, // },
{ // {
id: 'ORD-108239', // id: 'ORD-108239',
providerName: 'Burger Barn', // providerName: 'Burger Barn',
providerImage: '', // providerImage: '',
orderDate: '27 Jun 2026', // orderDate: '27 Jun 2026',
status: 'Delivered', // status: 'Delivered',
total: 449, // total: 449,
}, // },
]; // ];
export const MyOrdersScreen: React.FC = () => { export const MyOrdersScreen: React.FC = () => {
const { colors } = useAppTheme(); const { colors } = useAppTheme();
@ -78,8 +78,8 @@ export const MyOrdersScreen: React.FC = () => {
activeTab === 'All' activeTab === 'All'
? orders ? orders
: activeTab === 'Ongoing' : activeTab === 'Ongoing'
? orders.filter(o => ONGOING_STATUSES.includes(o.status)) ? orders.filter(o => ONGOING_STATUSES.includes(o.status))
: orders.filter(o => COMPLETED_STATUSES.includes(o.status)); : orders.filter(o => COMPLETED_STATUSES.includes(o.status));
return ( return (
<View style={styles.container}> <View style={styles.container}>

View File

@ -108,8 +108,8 @@ export const OrderDetailsScreen: React.FC = () => {
const orderDate = orderDetails.createdAt const orderDate = orderDetails.createdAt
? `${formatDate(orderDetails.createdAt)} at ${formatTime( ? `${formatDate(orderDetails.createdAt)} at ${formatTime(
orderDetails.createdAt, orderDetails.createdAt,
)}` )}`
: ''; : '';
return ( return (
@ -148,6 +148,7 @@ export const OrderDetailsScreen: React.FC = () => {
<OrderStatusTimeline <OrderStatusTimeline
tracking={orderDetails.tracking} tracking={orderDetails.tracking}
currentStatus={orderDetails.status} currentStatus={orderDetails.status}
deliveryPartner={orderDetails?.delivery?.deliveryPartner?.user}
/> />
</View> </View>

View File

@ -161,6 +161,22 @@ export interface Delivery {
proofOfDeliveryKey: string | null; proofOfDeliveryKey: string | null;
pickedUpAt: string | null; pickedUpAt: string | null;
deliveredAt: string | null; deliveredAt: string | null;
deliveryPartner: {
id: string,
userId: string,
partnerCode: string,
kycStatus: string,
status: string,
availabilityStatus: string,
rating: number,
currentLatitude: number,
currentLongitude: number,
lastLocationAt: string,
user: {
name: string,
phone: string
}
}
} }
// export interface Merchant { // export interface Merchant {