From c26e17488598f4948dfea9c3c075fe4516a7a1d8 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Mon, 3 Nov 2025 09:00:49 +0700 Subject: [PATCH] refactor(FE-174): enhance RecordingApi by adding approve and reject methods for better approval handling --- .../production/recording/RecordingTable.tsx | 28 ++++--------- .../recording/form/RecordingForm.tsx | 28 ++++--------- src/services/api/production.ts | 41 ++++++++++++++++++- 3 files changed, 55 insertions(+), 42 deletions(-) diff --git a/src/components/pages/production/recording/RecordingTable.tsx b/src/components/pages/production/recording/RecordingTable.tsx index 5e018e61..45ed54a5 100644 --- a/src/components/pages/production/recording/RecordingTable.tsx +++ b/src/components/pages/production/recording/RecordingTable.tsx @@ -226,16 +226,10 @@ const RecordingTable = () => { const bulkApproveHandler = async () => { setIsBulkApproveLoading(true); - const approveResponse = await RecordingApi.customRequest< - BaseApiResponse - >('approvals', { - method: 'POST', - payload: { - action: 'APPROVED', - approvable_ids: selectedRowIds, - notes: 'Bulk Approved', - }, - }); + const approveResponse = await RecordingApi.approve( + selectedRowIds, + 'Bulk Approved' + ); if (isResponseSuccess(approveResponse)) { await refreshRecordings(); @@ -255,16 +249,10 @@ const RecordingTable = () => { const bulkRejectHandler = async () => { setIsBulkRejectLoading(true); - const rejectResponse = await RecordingApi.customRequest< - BaseApiResponse - >('approvals', { - method: 'POST', - payload: { - action: 'REJECTED', - approvable_ids: selectedRowIds, - notes: 'Bulk Rejected', - }, - }); + const rejectResponse = await RecordingApi.reject( + selectedRowIds, + 'Bulk Rejected' + ); if (isResponseSuccess(rejectResponse)) { refreshRecordings(); diff --git a/src/components/pages/production/recording/form/RecordingForm.tsx b/src/components/pages/production/recording/form/RecordingForm.tsx index 26d6aad7..7e888cd5 100644 --- a/src/components/pages/production/recording/form/RecordingForm.tsx +++ b/src/components/pages/production/recording/form/RecordingForm.tsx @@ -696,16 +696,10 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { const approveHandler = async () => { setIsApproveLoading(true); - const approveResponse = await RecordingApi.customRequest< - BaseApiResponse - >('approvals', { - method: 'POST', - payload: { - action: 'APPROVED', - approvable_ids: [initialValues?.id as number], - notes: 'Approved via Form', - }, - }); + const approveResponse = await RecordingApi.approve( + initialValues?.id as number, + 'Approved via Form' + ); if (isResponseSuccess(approveResponse)) { toast.success('Recording berhasil disetujui!'); @@ -724,16 +718,10 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { const rejectHandler = async () => { setIsRejectLoading(true); - const rejectResponse = await RecordingApi.customRequest< - BaseApiResponse - >('approvals', { - method: 'POST', - payload: { - action: 'REJECTED', - approvable_ids: [initialValues?.id as number], - notes: 'Rejected via Form', - }, - }); + const rejectResponse = await RecordingApi.reject( + initialValues?.id as number, + 'Rejected via Form' + ); if (isResponseSuccess(rejectResponse)) { toast.success('Recording berhasil ditolak!'); diff --git a/src/services/api/production.ts b/src/services/api/production.ts index 5c2754c8..788b9eb7 100644 --- a/src/services/api/production.ts +++ b/src/services/api/production.ts @@ -1,4 +1,5 @@ import { BaseApiService } from './base'; +import { BaseApiResponse } from '@/types/api/api-general'; import { CreateProjectFlockPayload, ProjectFlock, @@ -20,11 +21,47 @@ export const ProjectFlockApi = new BaseApiService< CreateProjectFlockPayload, UpdateProjectFlockPayload >('/production/project_flocks'); -export const RecordingApi = new BaseApiService< +export class RecordingService extends BaseApiService< Recording, CreateRecordingPayload, UpdateRecordingPayload ->('/production/recordings'); +> { + constructor(basePath: string = '') { + super(basePath); + } + + async approve( + idOrIds: number | number[], + notes: string = 'Approved via Form' + ): Promise | undefined> { + const approvable_ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds]; + return await this.customRequest>('approvals', { + method: 'POST', + payload: { + action: 'APPROVED', + approvable_ids, + notes, + }, + }); + } + + async reject( + idOrIds: number | number[], + notes: string = 'Rejected via Form' + ): Promise | undefined> { + const approvable_ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds]; + return await this.customRequest>('approvals', { + method: 'POST', + payload: { + action: 'REJECTED', + approvable_ids, + notes, + }, + }); + } +} + +export const RecordingApi = new RecordingService('/production/recordings'); export const ChickinApi = new BaseApiService< Chickin, CreateChickinPayload,