feat(admin): optimize tender list pagination
continuous-integration/drone/push Build is passing

This commit is contained in:
AmirReza Jamali
2026-07-11 15:46:19 +03:30
parent 624614f1a9
commit a762a14026
7 changed files with 136 additions and 92 deletions
+13 -5
View File
@@ -5,14 +5,16 @@ import { ApiResponse } from "../types";
import {
TTenderDetails,
TTenderDocumentsResponse,
TTenderListParams,
TTenderListMeta,
TTenderResponse,
TTenderTranslationResponse,
} from "../types/Tenders";
export const tendersService = {
tendersList: async (
params?: Record<string, any>,
): Promise<ApiResponse<TTenderResponse>> => {
params?: TTenderListParams,
): Promise<ApiResponse<TTenderResponse, TTenderListMeta>> => {
try {
return (
await api.get(API_ENDPOINTS.TENDERS.READ_ALL, {
@@ -30,7 +32,8 @@ export const tendersService = {
params?: Record<string, any>,
): Promise<ApiResponse<TTenderDetails>> => {
try {
return (await api.get(API_ENDPOINTS.TENDERS.DETAILS(id), { params })).data;
return (await api.get(API_ENDPOINTS.TENDERS.DETAILS(id), { params }))
.data;
} catch (error) {
console.error(
"ERROR caught in Tender Service => tender details: ",
@@ -53,12 +56,17 @@ export const tendersService = {
})
).data;
} catch (error) {
console.error("ERROR caught in Tender Service => translate tender: ", error);
console.error(
"ERROR caught in Tender Service => translate tender: ",
error,
);
throw error;
}
},
getDocuments: async (id: string): Promise<ApiResponse<TTenderDocumentsResponse[]>> => {
getDocuments: async (
id: string,
): Promise<ApiResponse<TTenderDocumentsResponse[]>> => {
try {
return (await api.get(API_ENDPOINTS.TENDERS.DOCUMENTS(id))).data;
} catch (error) {
+25 -1
View File
@@ -123,9 +123,33 @@ export const TendersResponse = z.object({
tenders: z.array(TenderSchema).or(z.null()),
});
export type TTenderDocumentsResponse = z.infer<typeof TenderDocumentsResponseSchema>;
export type TTenderDocumentsResponse = z.infer<
typeof TenderDocumentsResponseSchema
>;
export type TTenderResponse = z.infer<typeof TendersResponse>;
export type TTenderDetails = z.infer<typeof TenderSchema>;
export interface TTenderListParams {
limit?: number;
offset?: number;
cursor?: string;
include_total?: boolean;
sort_by?: string;
sort_order?: "asc" | "desc";
q?: string;
status?: string[];
country?: string;
documents_scraped?: boolean;
[key: string]: unknown;
}
export interface TTenderListMeta {
limit: number;
offset: number;
has_more: boolean;
next_cursor?: string;
total?: number;
page?: number;
pages?: number;
}
export type TTenderTranslationResponse = z.infer<
typeof TenderTranslationResponseSchema
>;
+2 -2
View File
@@ -1,9 +1,9 @@
import { IMetaData } from "./Factory";
export interface ApiResponse<T> {
export interface ApiResponse<T, TMeta = IMetaData> {
data: T;
message: string;
code?: number;
meta?: IMetaData;
meta?: TMeta;
success: boolean;
}