Update delivery tasks client

This commit is contained in:
2026-09-03 13:31:14 +05:30
parent 831f33df34
commit 1357f7e3f8
@@ -16,6 +16,10 @@ import { toast } from '@/components/ui/toast'
import { deliveryTasks as deliveryTasksApi, rides as ridesApi, getApiError, getPaginatedItems } from '@/lib/api/index' import { deliveryTasks as deliveryTasksApi, rides as ridesApi, getApiError, getPaginatedItems } from '@/lib/api/index'
import type { DeliveryTaskResponse, DeliveryTaskStatus, RideResponse } from '@/types/api' import type { DeliveryTaskResponse, DeliveryTaskStatus, RideResponse } from '@/types/api'
import { DeliveryTaskViewSheet } from './delivery-task-view-sheet'
import { DeliveryTaskDeliverDialog } from './delivery-task-deliver-dialog'
import { DeliveryTaskFailDialog } from './delivery-task-fail-dialog'
const fmtDate = (v: string) => const fmtDate = (v: string) =>
new Date(v).toLocaleDateString('en-GB', { day: '2-digit', month: 'short', year: 'numeric' }) new Date(v).toLocaleDateString('en-GB', { day: '2-digit', month: 'short', year: 'numeric' })
@@ -35,6 +39,11 @@ export function DeliveryTasksClient() {
const [rides, setRides] = useState<RideResponse[]>([]) const [rides, setRides] = useState<RideResponse[]>([])
const [selectedRideId, setSelectedRideId] = useState('') const [selectedRideId, setSelectedRideId] = useState('')
const [viewOpen, setViewOpen] = useState(false)
const [deliverOpen, setDeliverOpen] = useState(false)
const [failOpen, setFailOpen] = useState(false)
const [selectedTask, setSelectedTask] = useState<DeliveryTaskResponse | null>(null)
const selectedRide = useMemo( const selectedRide = useMemo(
() => rides.find((ride) => ride.id === selectedRideId) ?? null, () => rides.find((ride) => ride.id === selectedRideId) ?? null,
[rides, selectedRideId] [rides, selectedRideId]
@@ -51,7 +60,7 @@ export function DeliveryTasksClient() {
} }
}, []) }, [])
const fetchData = useCallback(async (rideId: string, p: number, ps: number) => { const fetchData = useCallback(async (rideId: string) => {
if (!rideId) { if (!rideId) {
setData([]) setData([])
setTotal(0) setTotal(0)
@@ -61,9 +70,9 @@ export function DeliveryTasksClient() {
setLoading(true) setLoading(true)
try { try {
const res = await deliveryTasksApi.listByRide(rideId, { page: p, pageSize: ps }) const items = await deliveryTasksApi.listByRide(rideId)
setData(getPaginatedItems(res)) setData(items)
setTotal(res.total) setTotal(items.length)
} catch (err) { } catch (err) {
toast.add({ title: 'Failed to load delivery tasks', description: getApiError(err), type: 'error' }) toast.add({ title: 'Failed to load delivery tasks', description: getApiError(err), type: 'error' })
} finally { } finally {
@@ -76,12 +85,26 @@ export function DeliveryTasksClient() {
}, [fetchRides]) }, [fetchRides])
useEffect(() => { useEffect(() => {
fetchData(selectedRideId, page, pageSize) fetchData(selectedRideId)
}, [fetchData, selectedRideId, page, pageSize]) }, [fetchData, selectedRideId])
function handleView(row: DeliveryTaskResponse) {
setSelectedTask(row)
setViewOpen(true)
}
function handleDeliver(row: DeliveryTaskResponse) {
setSelectedTask(row)
setDeliverOpen(true)
}
function handleFail(row: DeliveryTaskResponse) {
setSelectedTask(row)
setFailOpen(true)
}
const tableConfig = useMemo<TableConfig<DeliveryTaskResponse>>(() => ({ const tableConfig = useMemo<TableConfig<DeliveryTaskResponse>>(() => ({
rowKey: 'id', rowKey: 'id',
serverSide: true,
stickyHeader: true, stickyHeader: true,
emptyMessage: selectedRideId ? 'No delivery tasks found for this ride.' : 'Select a ride to view its delivery tasks.', emptyMessage: selectedRideId ? 'No delivery tasks found for this ride.' : 'Select a ride to view its delivery tasks.',
pagination: { enabled: true, pageSize, pageSizeOptions: [10, 20, 50] }, pagination: { enabled: true, pageSize, pageSizeOptions: [10, 20, 50] },
@@ -117,6 +140,27 @@ export function DeliveryTasksClient() {
width: 140, width: 140,
}, },
], ],
rowActions: {
actions: () => [
{
action: 'view',
label: 'View task',
onClick: handleView,
},
{
action: 'confirm',
label: 'Confirm delivery',
onClick: handleDeliver,
visible: (target) => target.status === 'Pending',
},
{
action: 'cancel',
label: 'Mark as failed',
onClick: handleFail,
visible: (target) => target.status === 'Pending',
},
],
},
}), [pageSize]) }), [pageSize])
return ( return (
@@ -162,10 +206,27 @@ export function DeliveryTasksClient() {
data={data} data={data}
loading={loading} loading={loading}
totalCount={total} totalCount={total}
onServerSideChange={({ page: p }) => { />
setPage(p.page)
setPageSize(p.pageSize) <DeliveryTaskViewSheet
}} open={viewOpen}
onClose={() => setViewOpen(false)}
task={selectedTask}
/>
<DeliveryTaskDeliverDialog
open={deliverOpen}
onClose={() => setDeliverOpen(false)}
onSuccess={() => fetchData(selectedRideId)}
task={selectedTask}
vehicleId={selectedRide?.vehicleId ?? null}
/>
<DeliveryTaskFailDialog
open={failOpen}
onClose={() => setFailOpen(false)}
onSuccess={() => fetchData(selectedRideId)}
task={selectedTask}
/> />
</> </>
) )