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 =====
const createMovementHandler = useCallback(
async (payload: CreateMovementPayload, documents: File[] = []) => {
const formData = new FormData();
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
);
async (payload: CreateMovementPayload) => {
const res = await MovementApi.createMovement(payload);
if (isResponseError(res)) {
setMovementFormErrorMessage(res.message);
return;
@@ -218,20 +210,23 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => {
});
const payload: CreateMovementPayload = {
transfer_reason: values.transfer_reason,
transfer_date: values.transfer_date,
source_warehouse_id: values.source_warehouse_id,
destination_warehouse_id: values.destination_warehouse_id,
products: values.products.map((p) => ({
product_id: p.product_id,
product_qty: parseInt(p.product_qty.toString()) || 0,
})),
deliveries: deliveriesPayload,
data: {
transfer_reason: values.transfer_reason,
transfer_date: values.transfer_date,
source_warehouse_id: values.source_warehouse_id,
destination_warehouse_id: values.destination_warehouse_id,
products: values.products.map((p) => ({
product_id: p.product_id,
product_qty: parseInt(p.product_qty.toString()) || 0,
})),
deliveries: deliveriesPayload,
},
documents: documents.length > 0 ? documents : undefined,
};
switch (type) {
case 'add':
await createMovementHandler(payload, documents);
await createMovementHandler(payload);
break;
}
},
+30 -2
View File
@@ -1,4 +1,5 @@
import { BaseApiService } from '@/services/api/base';
import { BaseApiResponse } from '@/types/api/api-general';
import {
CreateProductWarehousePayload,
ProductWarehouse,
@@ -20,11 +21,38 @@ export const ProductWarehouseApi = new BaseApiService<
UpdateProductWarehousePayload
>('/inventory/product-warehouses');
export const MovementApi = new BaseApiService<
export class MovementApiService extends BaseApiService<
Movement,
CreateMovementPayload,
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<
InventoryAdjustment,
+6 -1
View File
@@ -49,7 +49,7 @@ export type BaseMovement = {
export type Movement = BaseMetadata & BaseMovement;
export type CreateMovementPayload = {
export type CreateMovementPayloadData = {
transfer_reason: string;
transfer_date: string;
source_warehouse_id: number;
@@ -71,3 +71,8 @@ export type CreateMovementPayload = {
}[];
}[];
};
export type CreateMovementPayload = {
data: CreateMovementPayloadData;
documents?: File[];
};