add archive featcher to role , brtanch , car_mainte also update client and clien_addres create car mainte fails and update car fails delete car_maint from saidbar and but it in car model also update car image display

This commit is contained in:
m7amedez1122
2026-07-06 17:41:12 +03:00
parent 25f3468d74
commit a7e53f2047
56 changed files with 3864 additions and 147 deletions

View File

@@ -0,0 +1,75 @@
"use client";
import { useCallback, useEffect, useMemo, useState } from "react";
import { getStoredToken } from "@/src/lib/auth";
import { carMaintenanceService } from "@/src/services/carMaintanance.service";
import type { CarMaintenance } from "@/src/types/carMaintanance";
const PAGE_SIZE = 12;
/**
* useArchivedCarMaintenance
* ─────────────────────────────────────────────────────────────────────────
* Same contract as `useArchivedCars`: the backend returns the whole archived
* list in one call, so pagination + search are handled client-side here.
*
* Pass a `carId` to scope to one vehicle (`GET /cars/:carId/maintenance/archived`),
* or `null` to load every archived record system-wide (`GET /maintenance/archived`).
*/
export function useArchivedCarMaintenance(carId: string | null) {
const [allRecords, setAllRecords] = useState<CarMaintenance[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const [page, setPage] = useState(1);
const [search, setSearch] = useState("");
const load = useCallback(() => {
const token = getStoredToken();
setLoading(true);
setError(null);
const request = carId
? carMaintenanceService.getArchived(carId, token)
: carMaintenanceService.getAllArchivedGlobal(token);
request
.then((res) => {
const payload = (res as unknown as { data: { data: CarMaintenance[] } }).data ?? res;
setAllRecords((payload as { data: CarMaintenance[] }).data ?? []);
})
.catch((err: Error) => setError(err.message))
.finally(() => setLoading(false));
}, [carId]);
useEffect(() => { queueMicrotask(load); }, [load]);
const filtered = useMemo(() => {
if (!search.trim()) return allRecords;
const q = search.trim().toLowerCase();
return allRecords.filter(r =>
r.reason.toLowerCase().includes(q) ||
(r.car
? `${r.car.manufacturer} ${r.car.model} ${r.car.plateLetters} ${r.car.plateNumber}`
.toLowerCase()
.includes(q)
: false),
);
}, [allRecords, search]);
const total = filtered.length;
const pages = Math.max(1, Math.ceil(total / PAGE_SIZE));
const records = useMemo(
() => filtered.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE),
[filtered, page],
);
const handleSearch = (value: string) => {
setSearch(value);
setPage(1);
};
return {
records, loading, error, total, pages, page, search,
setPage, handleSearch, refresh: load, setError,
};
}