Use client-side pagination for rides
This commit is contained in:
@@ -30,8 +30,6 @@ const RIDE_STATUS_VARIANT: Record<RideStatus, 'default' | 'secondary' | 'destruc
|
|||||||
export function RidesClient() {
|
export function RidesClient() {
|
||||||
const [data, setData] = useState<RideResponse[]>([])
|
const [data, setData] = useState<RideResponse[]>([])
|
||||||
const [loading, setLoading] = useState(true)
|
const [loading, setLoading] = useState(true)
|
||||||
const [total, setTotal] = useState(0)
|
|
||||||
const [page, setPage] = useState(1)
|
|
||||||
const [pageSize, setPageSize] = useState(20)
|
const [pageSize, setPageSize] = useState(20)
|
||||||
|
|
||||||
const [sheetOpen, setSheetOpen] = useState(false)
|
const [sheetOpen, setSheetOpen] = useState(false)
|
||||||
@@ -41,12 +39,11 @@ export function RidesClient() {
|
|||||||
const [closeOpen, setCloseOpen] = useState(false)
|
const [closeOpen, setCloseOpen] = useState(false)
|
||||||
const [selectedRide, setSelectedRide] = useState<RideResponse | null>(null)
|
const [selectedRide, setSelectedRide] = useState<RideResponse | null>(null)
|
||||||
|
|
||||||
const fetchData = useCallback(async (p: number, ps: number) => {
|
const fetchData = useCallback(async () => {
|
||||||
setLoading(true)
|
setLoading(true)
|
||||||
try {
|
try {
|
||||||
const res = await ridesApi.list({ page: p, pageSize: ps })
|
const res = await ridesApi.list({ pageSize: 500 })
|
||||||
setData(getPaginatedItems(res))
|
setData(getPaginatedItems(res))
|
||||||
setTotal(res.total)
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
toast.add({ title: 'Failed to load rides', description: getApiError(err), type: 'error' })
|
toast.add({ title: 'Failed to load rides', description: getApiError(err), type: 'error' })
|
||||||
} finally {
|
} finally {
|
||||||
@@ -55,8 +52,8 @@ export function RidesClient() {
|
|||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchData(page, pageSize)
|
fetchData()
|
||||||
}, [fetchData, page, pageSize])
|
}, [fetchData])
|
||||||
|
|
||||||
function handleView(row: RideResponse) {
|
function handleView(row: RideResponse) {
|
||||||
setSelectedRide(row)
|
setSelectedRide(row)
|
||||||
@@ -80,7 +77,6 @@ export function RidesClient() {
|
|||||||
|
|
||||||
const tableConfig = useMemo<TableConfig<RideResponse>>(() => ({
|
const tableConfig = useMemo<TableConfig<RideResponse>>(() => ({
|
||||||
rowKey: 'id',
|
rowKey: 'id',
|
||||||
serverSide: true,
|
|
||||||
stickyHeader: true,
|
stickyHeader: true,
|
||||||
emptyMessage: 'No rides found.',
|
emptyMessage: 'No rides found.',
|
||||||
pagination: { enabled: true, pageSize, pageSizeOptions: [10, 20, 50] },
|
pagination: { enabled: true, pageSize, pageSizeOptions: [10, 20, 50] },
|
||||||
@@ -175,9 +171,8 @@ export function RidesClient() {
|
|||||||
config={tableConfig}
|
config={tableConfig}
|
||||||
data={data}
|
data={data}
|
||||||
loading={loading}
|
loading={loading}
|
||||||
totalCount={total}
|
totalCount={data.length}
|
||||||
onServerSideChange={({ page: p }) => {
|
onServerSideChange={({ page: p }) => {
|
||||||
setPage(p.page)
|
|
||||||
setPageSize(p.pageSize)
|
setPageSize(p.pageSize)
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
@@ -185,7 +180,7 @@ export function RidesClient() {
|
|||||||
<RideSheet
|
<RideSheet
|
||||||
open={sheetOpen}
|
open={sheetOpen}
|
||||||
onClose={() => setSheetOpen(false)}
|
onClose={() => setSheetOpen(false)}
|
||||||
onSuccess={() => fetchData(page, pageSize)}
|
onSuccess={fetchData}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<RideViewSheet
|
<RideViewSheet
|
||||||
@@ -197,21 +192,21 @@ export function RidesClient() {
|
|||||||
<RideEditDriverSheet
|
<RideEditDriverSheet
|
||||||
open={editDriverOpen}
|
open={editDriverOpen}
|
||||||
onClose={() => setEditDriverOpen(false)}
|
onClose={() => setEditDriverOpen(false)}
|
||||||
onSuccess={() => fetchData(page, pageSize)}
|
onSuccess={fetchData}
|
||||||
ride={selectedRide}
|
ride={selectedRide}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<RideCancelDialog
|
<RideCancelDialog
|
||||||
open={cancelOpen}
|
open={cancelOpen}
|
||||||
onClose={() => setCancelOpen(false)}
|
onClose={() => setCancelOpen(false)}
|
||||||
onSuccess={() => fetchData(page, pageSize)}
|
onSuccess={fetchData}
|
||||||
ride={selectedRide}
|
ride={selectedRide}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<RideCloseDialog
|
<RideCloseDialog
|
||||||
open={closeOpen}
|
open={closeOpen}
|
||||||
onClose={() => setCloseOpen(false)}
|
onClose={() => setCloseOpen(false)}
|
||||||
onSuccess={() => fetchData(page, pageSize)}
|
onSuccess={fetchData}
|
||||||
ride={selectedRide}
|
ride={selectedRide}
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
|
|||||||
Reference in New Issue
Block a user