udpates on the ui changesand api integration
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
|
||||
import { useQuery, useMutation, useQueryClient, useQueries } from '@tanstack/react-query';
|
||||
import type { Row } from './fiestaApi';
|
||||
import { loginRequest, matchTenantUser, buildAuthUser, type AuthUser } from './auth';
|
||||
import {
|
||||
FIESTA_TENANT_ID,
|
||||
FIESTA_APPLOCATION_ID,
|
||||
@@ -25,6 +26,10 @@ import {
|
||||
getDeliverySummary,
|
||||
getDeliveries,
|
||||
getDeliveryInsight,
|
||||
getDeliveryReport,
|
||||
getFleetSummary,
|
||||
getOrderDetails,
|
||||
getCustomerOrders,
|
||||
getRiders,
|
||||
getRiderShifts,
|
||||
getTenantLocations,
|
||||
@@ -32,6 +37,11 @@ import {
|
||||
getTenantCustomers,
|
||||
getStockStatement,
|
||||
getProductsCount,
|
||||
getProductStocks,
|
||||
getProductLocations,
|
||||
getMasterCatalog,
|
||||
getProductCategories,
|
||||
getProductSubcategories,
|
||||
getAllUsers,
|
||||
getUserById,
|
||||
createUser,
|
||||
@@ -55,6 +65,15 @@ export const fiestaKeys = {
|
||||
tenantCustomers: (params: Record<string, unknown>) => ['fiesta', 'tenantCustomers', params] as const,
|
||||
stockStatement: (params: Record<string, unknown>) => ['fiesta', 'stockStatement', params] as const,
|
||||
productsCount: (params: Record<string, unknown>) => ['fiesta', 'productsCount', params] as const,
|
||||
productStocks: (params: Record<string, unknown>) => ['fiesta', 'productStocks', params] as const,
|
||||
productLocations: (params: Record<string, unknown>) => ['fiesta', 'productLocations', params] as const,
|
||||
masterCatalog: (params: Record<string, unknown>) => ['fiesta', 'masterCatalog', params] as const,
|
||||
productCategories: () => ['fiesta', 'productCategories'] as const,
|
||||
productSubcategories: (params: Record<string, unknown>) => ['fiesta', 'productSubcategories', params] as const,
|
||||
orderDetails: (orderheaderid: number | string) => ['fiesta', 'orderDetails', orderheaderid] as const,
|
||||
customerOrders: (params: Record<string, unknown>) => ['fiesta', 'customerOrders', params] as const,
|
||||
deliveryReport: (params: Record<string, unknown>) => ['fiesta', 'deliveryReport', params] as const,
|
||||
fleetSummary: (params: Record<string, unknown>) => ['fiesta', 'fleetSummary', params] as const,
|
||||
users: (params: Record<string, unknown>) => ['fiesta', 'users', params] as const,
|
||||
user: (userid: number) => ['fiesta', 'user', userid] as const,
|
||||
};
|
||||
@@ -238,6 +257,117 @@ export function useFiestaStoresStock(
|
||||
}));
|
||||
}
|
||||
|
||||
// ── Order details / customer history ───────────────────────────────────────────
|
||||
export function useFiestaOrderDetails(orderheaderid: number | string | null | undefined) {
|
||||
return useQuery({
|
||||
queryKey: fiestaKeys.orderDetails(orderheaderid ?? ''),
|
||||
queryFn: () => getOrderDetails(orderheaderid as number | string),
|
||||
enabled: Boolean(orderheaderid),
|
||||
});
|
||||
}
|
||||
|
||||
export function useFiestaCustomerOrders(opts: {
|
||||
customerid: number | string | null | undefined;
|
||||
status?: string;
|
||||
pageno?: number;
|
||||
pagesize?: number;
|
||||
}) {
|
||||
return useQuery({
|
||||
queryKey: fiestaKeys.customerOrders(opts as Record<string, unknown>),
|
||||
queryFn: () =>
|
||||
getCustomerOrders({
|
||||
customerid: opts.customerid as number | string,
|
||||
status: opts.status,
|
||||
pageno: opts.pageno,
|
||||
pagesize: opts.pagesize,
|
||||
}),
|
||||
enabled: Boolean(opts.customerid),
|
||||
});
|
||||
}
|
||||
|
||||
// ── Deliveries report / fleet ───────────────────────────────────────────────────
|
||||
export function useFiestaDeliveryReport(opts: {
|
||||
tenantid: number;
|
||||
applocationid?: number;
|
||||
partnerid?: number;
|
||||
userid?: number;
|
||||
fromdate: string;
|
||||
todate: string;
|
||||
}) {
|
||||
return useQuery({
|
||||
queryKey: fiestaKeys.deliveryReport(opts),
|
||||
queryFn: () => getDeliveryReport(opts),
|
||||
enabled: Boolean(opts.tenantid && opts.fromdate && opts.todate),
|
||||
});
|
||||
}
|
||||
|
||||
export function useFiestaFleetSummary(opts: {
|
||||
tenantid: number;
|
||||
applocationid?: number;
|
||||
partnerid?: number;
|
||||
fromdate: string;
|
||||
todate: string;
|
||||
}) {
|
||||
return useQuery({
|
||||
queryKey: fiestaKeys.fleetSummary(opts),
|
||||
queryFn: () => getFleetSummary(opts),
|
||||
enabled: Boolean(opts.tenantid && opts.fromdate && opts.todate),
|
||||
});
|
||||
}
|
||||
|
||||
// ── Products: live stocks / catalog / categories ────────────────────────────────
|
||||
export function useFiestaProductStocks(opts: { tenantid: number; locationid: number }) {
|
||||
return useQuery({
|
||||
queryKey: fiestaKeys.productStocks(opts),
|
||||
queryFn: () => getProductStocks(opts),
|
||||
enabled: Boolean(opts.tenantid && opts.locationid),
|
||||
});
|
||||
}
|
||||
|
||||
export function useFiestaProductLocations(opts: {
|
||||
tenantid: number;
|
||||
locationid: number;
|
||||
subcategoryid?: number;
|
||||
pageno?: number;
|
||||
pagesize?: number;
|
||||
}) {
|
||||
return useQuery({
|
||||
queryKey: fiestaKeys.productLocations(opts),
|
||||
queryFn: () => getProductLocations(opts),
|
||||
enabled: Boolean(opts.tenantid && opts.locationid),
|
||||
});
|
||||
}
|
||||
|
||||
export function useFiestaMasterCatalog(opts: {
|
||||
tenantid: number;
|
||||
locationid?: number;
|
||||
subcategoryid?: number;
|
||||
keyword?: string;
|
||||
pageno?: number;
|
||||
pagesize?: number;
|
||||
}) {
|
||||
return useQuery({
|
||||
queryKey: fiestaKeys.masterCatalog(opts),
|
||||
queryFn: () => getMasterCatalog(opts),
|
||||
enabled: Boolean(opts.tenantid),
|
||||
});
|
||||
}
|
||||
|
||||
export function useFiestaProductCategories() {
|
||||
return useQuery({
|
||||
queryKey: fiestaKeys.productCategories(),
|
||||
queryFn: () => getProductCategories(),
|
||||
});
|
||||
}
|
||||
|
||||
export function useFiestaProductSubcategories(opts: { categoryid: number; tenantid?: number }) {
|
||||
return useQuery({
|
||||
queryKey: fiestaKeys.productSubcategories(opts),
|
||||
queryFn: () => getProductSubcategories(opts),
|
||||
enabled: Boolean(opts.categoryid),
|
||||
});
|
||||
}
|
||||
|
||||
// ── Users ─────────────────────────────────────────────────────────────────────
|
||||
export function useFiestaUsers(opts: {
|
||||
tenantid: number;
|
||||
@@ -279,4 +409,38 @@ export function useFiestaUpdateUser() {
|
||||
});
|
||||
}
|
||||
|
||||
// ── Auth ──────────────────────────────────────────────────────────────────────
|
||||
/**
|
||||
* Verify login credentials against the Fiesta web-login endpoint. A mutation
|
||||
* (not a query) since it's a POST with side effects; the form drives it via
|
||||
* `mutate`/`mutateAsync` and reads `isPending`/`error` for loading + error UI.
|
||||
*
|
||||
* Both network calls go through React Query: the login POST is the mutation,
|
||||
* and the role-resolution fallback (when the login response omits the role) is
|
||||
* fetched via the query client — so it shares the Users-panel cache.
|
||||
*/
|
||||
export function useLogin() {
|
||||
const qc = useQueryClient();
|
||||
return useMutation<AuthUser, Error, { email: string; password: string }>({
|
||||
mutationFn: async ({ email, password }) => {
|
||||
const result = await loginRequest(email, password);
|
||||
let row = result.row;
|
||||
|
||||
// The login response didn't carry a role — resolve it from the tenant user
|
||||
// list through the query cache (deduped with useFiestaUsers).
|
||||
if (!result.hasRole) {
|
||||
const params = { tenantid: FIESTA_TENANT_ID, keyword: result.email, pagesize: 50 };
|
||||
const users = await qc.fetchQuery({
|
||||
queryKey: fiestaKeys.users(params),
|
||||
queryFn: () => getAllUsers(params),
|
||||
});
|
||||
const match = matchTenantUser(users, result.email);
|
||||
if (match) row = { ...match, ...(row ?? {}) };
|
||||
}
|
||||
|
||||
return buildAuthUser(row, result.email);
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export { FIESTA_TENANT_ID, FIESTA_APPLOCATION_ID, FIESTA_PRIMARY_LOCATION_ID };
|
||||
|
||||
Reference in New Issue
Block a user