mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-26 18:42:49 +00:00
145 lines
3.7 KiB
TypeScript
145 lines
3.7 KiB
TypeScript
import { client } from "@/utils/api";
|
|
import { unwrap } from "@/utils/endpoint";
|
|
import { URL_CONSTANTS } from "@/constants/URLS";
|
|
import type { ApiResponse } from "@/types/apiResponse";
|
|
import type { ProfileResponse, UpdateProfilePayload } from "@/types/profile";
|
|
import { isAxiosError } from "axios";
|
|
|
|
export interface ExternalProfileResponse {
|
|
id: string;
|
|
userId: string;
|
|
companyId: string;
|
|
firstName: string;
|
|
lastName: string;
|
|
email: string;
|
|
phone: string | null;
|
|
nationalId: string | null;
|
|
jobTitle: string | null;
|
|
isPrimaryContact: boolean;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
}
|
|
|
|
export interface CompanyResponse {
|
|
id: string;
|
|
name: string;
|
|
type: string;
|
|
status: string;
|
|
tin: string;
|
|
vatNumber: string | null;
|
|
businessLicense: string | null;
|
|
fanNumber: string | null;
|
|
country: string;
|
|
address: string | null;
|
|
phone: string | null;
|
|
email: string | null;
|
|
website: string | null;
|
|
attributes: Record<string, any> | null;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
}
|
|
|
|
export interface CompanyInfoResponse {
|
|
profile: ExternalProfileResponse;
|
|
company: CompanyResponse;
|
|
}
|
|
|
|
export interface CreateCompanyPayload {
|
|
companyType?: string;
|
|
companyName: string;
|
|
companyEmail?: string;
|
|
companyPhone?: string;
|
|
companyLocation?: string;
|
|
companyAddress?: string;
|
|
tin?: string;
|
|
vatNumber?: string;
|
|
fanNumber?: string;
|
|
jobTitle?: string;
|
|
isPrimaryContact?: boolean;
|
|
attributes?: Record<string, any>;
|
|
}
|
|
|
|
export interface FreightVolumePoint {
|
|
month: string;
|
|
tonnes: number;
|
|
}
|
|
|
|
export interface DashboardSummary {
|
|
deliveredCount: number;
|
|
completionRate: number;
|
|
spendYtd: number;
|
|
spendCurrency: string;
|
|
spendYtdChangePct: number;
|
|
freightVolume: {
|
|
totalTonnes: number;
|
|
totalValue: number;
|
|
currency: string;
|
|
ytdChangePct: number;
|
|
monthly: FreightVolumePoint[];
|
|
};
|
|
}
|
|
|
|
export const companiesService = {
|
|
getInfo: async (): Promise<CompanyInfoResponse | null> => {
|
|
try {
|
|
const response = await client.get<ApiResponse<CompanyInfoResponse>>(
|
|
URL_CONSTANTS.COMPANIES_API.GET_INFO,
|
|
);
|
|
return unwrap(response.data);
|
|
} catch (e) {
|
|
if (isAxiosError(e) && e.response?.status === 404) {
|
|
return null;
|
|
}
|
|
throw e;
|
|
}
|
|
},
|
|
|
|
create: async (payload: CreateCompanyPayload): Promise<CompanyInfoResponse> => {
|
|
const response = await client.post<ApiResponse<CompanyInfoResponse>>(
|
|
URL_CONSTANTS.COMPANIES_API.CREATE,
|
|
payload,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
getProfile: async (): Promise<ProfileResponse> => {
|
|
const response = await client.get<ApiResponse<ProfileResponse>>(
|
|
URL_CONSTANTS.COMPANIES_API.PROFILE,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
updateProfile: async (payload: UpdateProfilePayload): Promise<ProfileResponse> => {
|
|
const response = await client.patch<ApiResponse<ProfileResponse>>(
|
|
URL_CONSTANTS.COMPANIES_API.PROFILE,
|
|
payload,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
getDashboard: async (): Promise<DashboardSummary> => {
|
|
const response = await client.get<ApiResponse<DashboardSummary>>(
|
|
URL_CONSTANTS.COMPANIES_API.DASHBOARD,
|
|
);
|
|
return unwrap(response.data);
|
|
},
|
|
|
|
uploadDocuments: async (
|
|
companyId: string,
|
|
files: Record<string, File | File[] | null>,
|
|
): Promise<void> => {
|
|
const formData = new FormData();
|
|
for (const [fieldName, fileOrFiles] of Object.entries(files)) {
|
|
if (!fileOrFiles) continue;
|
|
if (Array.isArray(fileOrFiles)) {
|
|
for (const f of fileOrFiles) {
|
|
formData.append(fieldName, f);
|
|
}
|
|
} else {
|
|
formData.append(fieldName, fileOrFiles);
|
|
}
|
|
}
|
|
await client.post(URL_CONSTANTS.COMPANIES_API.DOCUMENTS(companyId), formData);
|
|
},
|
|
};
|