feat(delivery): add Torbat Driver frontend module with real API wiring.

Ship the delivery platform UI under modules/delivery with thin app routes, BFF proxy, CRUD for phase 10.0-10.1 APIs, and capability-gated future screens.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Mortezakoohjani 2026-07-27 12:02:01 +03:30
parent 203671a7bf
commit 7978970783
258 changed files with 5303 additions and 0 deletions

View File

@ -95,6 +95,32 @@
] ]
} }
}, },
{
"files": ["app/delivery/**/*", "modules/delivery/**/*"],
"rules": {
"no-restricted-imports": [
"error",
{
"patterns": [
{
"group": [
"@/components/accounting/**",
"@/components/beauty/**",
"@/components/healthcare/**",
"@/modules/beauty/**",
"@/modules/accounting/**",
"@/modules/hospitality/**",
"@/modules/crm/**",
"@/src/modules/healthcare/**",
"@/src/modules/accounting/**"
],
"message": "Delivery must not import other business modules."
}
]
}
]
}
},
{ {
"files": [ "files": [
"components/ds/**/*", "components/ds/**/*",
@ -120,6 +146,7 @@
"@/modules/beauty/**", "@/modules/beauty/**",
"@/modules/healthcare/**", "@/modules/healthcare/**",
"@/modules/hospitality/**", "@/modules/hospitality/**",
"@/modules/delivery/**",
"@/src/modules/healthcare/**", "@/src/modules/healthcare/**",
"@/src/modules/accounting/**", "@/src/modules/accounting/**",
"@/modules/accounting/**", "@/modules/accounting/**",

View File

@ -0,0 +1,53 @@
import { NextRequest, NextResponse } from "next/server";
const UPSTREAM =
process.env.DELIVERY_SERVICE_URL ||
process.env.NEXT_PUBLIC_DELIVERY_API_URL ||
"http://localhost:8007";
async function proxy(req: NextRequest, pathSegments: string[]) {
const p = pathSegments.join("/");
const url = new URL(req.url);
const target = `${UPSTREAM.replace(/\/$/, "")}/${p}${url.search}`;
const headers = new Headers();
for (const h of ["authorization", "content-type", "x-tenant-id", "accept"]) {
const v = req.headers.get(h);
if (v) headers.set(h, v);
}
let body: ArrayBuffer | undefined;
if (req.method !== "GET" && req.method !== "HEAD") body = await req.arrayBuffer();
try {
const res = await fetch(target, { method: req.method, headers, body, cache: "no-store" });
const out = new Headers();
const ct = res.headers.get("content-type");
if (ct) out.set("content-type", ct);
return new NextResponse(await res.arrayBuffer(), { status: res.status, headers: out });
} catch (err) {
const detail = err instanceof Error ? err.message : "upstream_unreachable";
return NextResponse.json(
{ error: { code: "delivery_proxy_error", message: `پروکسی تربت درایور — ${detail}` } },
{ status: 502 }
);
}
}
export async function GET(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
const { path: p } = await ctx.params;
return proxy(req, p);
}
export async function POST(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
const { path: p } = await ctx.params;
return proxy(req, p);
}
export async function PATCH(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
const { path: p } = await ctx.params;
return proxy(req, p);
}
export async function PUT(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
const { path: p } = await ctx.params;
return proxy(req, p);
}
export async function DELETE(req: NextRequest, ctx: { params: Promise<{ path: string[] }> }) {
const { path: p } = await ctx.params;
return proxy(req, p);
}

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { AiRecommendationsPage as default } from "@/modules/delivery/features/aiRecommendations";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { HeatMapsPage as default } from "@/modules/delivery/features/heatmaps";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { PerformanceKpisPage as default } from "@/modules/delivery/features/kpis";

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { AnalyticsPage as default } from "@/modules/delivery/features/analytics";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { ApiKeysPage as default } from "@/modules/delivery/features/apiKeys";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { AuditLogsPage as default } from "@/modules/delivery/features/audit";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { AutomationPage as default } from "@/modules/delivery/features/automation";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { BranchesPage as default } from "@/modules/delivery/features/branches";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { CapabilitiesPage as default } from "@/modules/delivery/features/capabilities";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { CodManagementPage as default } from "@/modules/delivery/features/cod";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { CommissionsPage as default } from "@/modules/delivery/features/commissions";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { ConfigurationsPage as default } from "@/modules/delivery/features/configurations";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { DeliveriesPage as default } from "@/modules/delivery/features/deliveries";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { AssignmentCenterPage as default } from "@/modules/delivery/features/assignment";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { DispatchQueuePage as default } from "@/modules/delivery/features/dispatchQueue";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { DispatcherDashboard as default } from "@/modules/delivery/features/dispatcher";

View File

@ -0,0 +1,3 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) { return <ErrorState message={error.message} onRetry={reset} />; }

View File

@ -0,0 +1,2 @@
import { LoadingState } from "@/components/ds";
export default function Loading() { return <LoadingState label="بارگذاری راننده…" />; }

View File

@ -0,0 +1,3 @@
"use client";
export { DriverDetailPage as default } from "@/modules/delivery/features/driverDetail";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { DriverAvailabilityPage as default } from "@/modules/delivery/features/driverAvailability";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { DriversPage as default } from "@/modules/delivery/features/drivers";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { DriverPerformancePage as default } from "@/modules/delivery/features/driverPerformance";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { FailedDeliveriesPage as default } from "@/modules/delivery/features/failed";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { FleetDashboard as default } from "@/modules/delivery/features/fleetDashboard";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { FleetMaintenancePage as default } from "@/modules/delivery/features/maintenance";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { HealthPage as default } from "@/modules/delivery/features/health";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { DeliveryHub as default } from "@/modules/delivery/features/hub";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { IncidentsPage as default } from "@/modules/delivery/features/incidents";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { ExternalProvidersPage as default } from "@/modules/delivery/features/externalProviders";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { RoutingEnginesPage as default } from "@/modules/delivery/features/routingEngines";

View File

@ -0,0 +1,5 @@
"use client";
import { DeliveryRootLayout } from "@/modules/delivery/components/createPortalLayout";
export default DeliveryRootLayout;

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { GeofencePage as default } from "@/modules/delivery/features/geofence";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { RouteOptimizationPage as default } from "@/modules/delivery/features/routeOptimization";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

View File

@ -0,0 +1,3 @@
"use client";
export { RoutePlannerPage as default } from "@/modules/delivery/features/routePlanner";

View File

@ -0,0 +1,7 @@
"use client";
import { ErrorState } from "@/components/ds";
export default function Error({ error, reset }: { error: Error; reset: () => void }) {
return <ErrorState message={error.message} onRetry={reset} />;
}

View File

@ -0,0 +1,5 @@
import { LoadingState } from "@/components/ds";
export default function Loading() {
return <LoadingState label="در حال بارگذاری تربت درایور…" />;
}

Some files were not shown because too many files have changed in this diff Show More