refactor(FE): Move Movement FormData into API service

This commit is contained in:
rstubryan
2026-01-02 10:00:14 +07:00
parent 6a3d2c0dcd
commit 1c77deeee7
3 changed files with 51 additions and 23 deletions
@@ -55,16 +55,8 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
// ===== FORM HANDLERS ===== // ===== FORM HANDLERS =====
const createMovementHandler = useCallback( const createMovementHandler = useCallback(
async (payload: CreateMovementPayload, documents: File[] = []) => { async (payload: CreateMovementPayload) => {
const formData = new FormData(); const res = await MovementApi.createMovement(payload);
formData.append('data', JSON.stringify(payload));
documents.forEach((file, index) => {
formData.append(`documents[${index}]`, file);
});
const res = await MovementApi.create(
formData as unknown as CreateMovementPayload
);
if (isResponseError(res)) { if (isResponseError(res)) {
setMovementFormErrorMessage(res.message); setMovementFormErrorMessage(res.message);
return; return;
@@ -218,20 +210,23 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
}); });
const payload: CreateMovementPayload = { const payload: CreateMovementPayload = {
transfer_reason: values.transfer_reason, data: {
transfer_date: values.transfer_date, transfer_reason: values.transfer_reason,
source_warehouse_id: values.source_warehouse_id, transfer_date: values.transfer_date,
destination_warehouse_id: values.destination_warehouse_id, source_warehouse_id: values.source_warehouse_id,
products: values.products.map((p) => ({ destination_warehouse_id: values.destination_warehouse_id,
product_id: p.product_id, products: values.products.map((p) => ({
product_qty: parseInt(p.product_qty.toString()) || 0, product_id: p.product_id,
})), product_qty: parseInt(p.product_qty.toString()) || 0,
deliveries: deliveriesPayload, })),
deliveries: deliveriesPayload,
},
documents: documents.length > 0 ? documents : undefined,
}; };
switch (type) { switch (type) {
case 'add': case 'add':
await createMovementHandler(payload, documents); await createMovementHandler(payload);
break; break;
} }
}, },
+30 -2
View File
@@ -1,4 +1,5 @@
import { BaseApiService } from '@/services/api/base'; import { BaseApiService } from '@/services/api/base';
import { BaseApiResponse } from '@/types/api/api-general';
import { import {
CreateProductWarehousePayload, CreateProductWarehousePayload,
ProductWarehouse, ProductWarehouse,
@@ -20,11 +21,38 @@ export const ProductWarehouseApi = new BaseApiService<
UpdateProductWarehousePayload UpdateProductWarehousePayload
>('/inventory/product-warehouses'); >('/inventory/product-warehouses');
export const MovementApi = new BaseApiService< export class MovementApiService extends BaseApiService<
Movement, Movement,
CreateMovementPayload, CreateMovementPayload,
unknown unknown
>('/inventory/transfers'); > {
constructor(basePath: string) {
super(basePath);
}
async createMovement(
payload: CreateMovementPayload
): Promise<BaseApiResponse<Movement> | undefined> {
const formData = new FormData();
// Append data as JSON string
formData.append('data', JSON.stringify(payload.data));
// Append documents if any
if (payload.documents && payload.documents.length > 0) {
payload.documents.forEach((file) => {
formData.append('documents', file);
});
}
return await this.customRequest<BaseApiResponse<Movement>>('', {
method: 'POST',
payload: formData as unknown as Record<string, unknown>,
});
}
}
export const MovementApi = new MovementApiService('/inventory/transfers');
export const InventoryAdjustmentApi = new BaseApiService< export const InventoryAdjustmentApi = new BaseApiService<
InventoryAdjustment, InventoryAdjustment,
+6 -1
View File
@@ -49,7 +49,7 @@ export type BaseMovement = {
export type Movement = BaseMetadata & BaseMovement; export type Movement = BaseMetadata & BaseMovement;
export type CreateMovementPayload = { export type CreateMovementPayloadData = {
transfer_reason: string; transfer_reason: string;
transfer_date: string; transfer_date: string;
source_warehouse_id: number; source_warehouse_id: number;
@@ -71,3 +71,8 @@ export type CreateMovementPayload = {
}[]; }[];
}[]; }[];
}; };
export type CreateMovementPayload = {
data: CreateMovementPayloadData;
documents?: File[];
};