refactor(FE-238-86): change useApprovalSteps params, and minimize fetching data

This commit is contained in:
randy-ar
2025-11-13 11:18:11 +07:00
parent def7ee4a0b
commit e5318fd6b5
7 changed files with 37 additions and 111 deletions
+20 -44
View File
@@ -8,9 +8,8 @@ import {
BaseApiResponse, BaseApiResponse,
BaseApproval, BaseApproval,
BaseGroupedApproval, BaseGroupedApproval,
ModuleWithApproval,
} from '@/types/api/api-general'; } from '@/types/api/api-general';
import { AppConfigData, ApprovalLine } from '@/types/config/constant'; import { ApprovalLine } from '@/types/config/constant';
import useSWR from 'swr'; import useSWR from 'swr';
import { httpClientFetcher } from '@/services/http/client'; import { httpClientFetcher } from '@/services/http/client';
import { isResponseSuccess } from '@/lib/api-helper'; import { isResponseSuccess } from '@/lib/api-helper';
@@ -238,13 +237,15 @@ const isGroupedApprovalData = (
); );
}; };
const useApprovalSteps = <T extends ModuleWithApproval>({ const useApprovalSteps = ({
moduleUrl, latestApproval,
approvalLines,
moduleName, moduleName,
moduleId, moduleId,
params, params,
}: { }: {
moduleUrl: string; latestApproval: BaseApproval | undefined;
approvalLines: ApprovalLine;
moduleName: string; moduleName: string;
moduleId: string; moduleId: string;
params?: { params?: {
@@ -254,26 +255,20 @@ const useApprovalSteps = <T extends ModuleWithApproval>({
group_step_number?: boolean; group_step_number?: boolean;
}; };
}) => { }) => {
// Membuat URL Parameters
const paramString = new URLSearchParams({ const paramString = new URLSearchParams({
page: params?.page?.toString() || '', page: params?.page?.toString() || '',
limit: params?.limit?.toString() || '', limit: params?.limit?.toString() || '',
search: params?.search || '', search: params?.search || '',
}).toString(); }).toString();
const SWR_KEY_CONSTANTS = '/constants';
// fetching data approvals
const SWR_KEY_APPROVALS = const SWR_KEY_APPROVALS =
moduleName && moduleId moduleName && moduleId
? `/approvals?module_name=${moduleName}&module_id=${moduleId}${ ? `/approvals?module_name=${moduleName}&module_id=${moduleId}${
params ? `&${paramString}` : '' params ? `&${paramString}` : ''
}` }`
: null; : null;
const SWR_KEY_CURRENT_DATA = moduleUrl;
const { data: constData, isLoading: constIsLoading } = useSWR(
SWR_KEY_CONSTANTS,
async (url) => {
return await httpClientFetcher<AppConfigData>(url);
}
);
const { const {
data: approvalData, data: approvalData,
@@ -285,30 +280,12 @@ const useApprovalSteps = <T extends ModuleWithApproval>({
>(url); >(url);
}); });
const {
data: currentData,
isLoading: currentIsLoading,
mutate: mutateCurrentData,
} = useSWR(SWR_KEY_CURRENT_DATA, async (url) => {
return await httpClientFetcher<BaseApiResponse<T>>(url);
});
// Fungsi Refresh // Fungsi Refresh
const refresh = useCallback(async () => { const refresh = useCallback(async () => {
await Promise.all([mutateApprovals(), mutateCurrentData()]); await mutateApprovals();
}, [mutateApprovals, mutateCurrentData]); }, [mutateApprovals]);
const { approvalLine, groupedApprovals, latestApproval } = useMemo(() => {
const line = constData
? (constData.approval_workflows.find((approval) => {
return approval.key === moduleName;
})?.steps ?? [])
: [];
const latest = isResponseSuccess(currentData)
? currentData.data?.approval
: undefined;
const { groupedApprovals } = useMemo(() => {
const rawData = isResponseSuccess(approvalData) const rawData = isResponseSuccess(approvalData)
? approvalData.data ? approvalData.data
: undefined; : undefined;
@@ -326,30 +303,30 @@ const useApprovalSteps = <T extends ModuleWithApproval>({
} }
return { return {
approvalLine: line,
groupedApprovals: processedGroupedApprovals, groupedApprovals: processedGroupedApprovals,
latestApproval: latest,
}; };
}, [constData, approvalData, currentData, moduleName]); }, [approvalData]);
const isLoading = constIsLoading || approvalIsLoading || currentIsLoading; const isLoading = approvalIsLoading;
// Formatting Akhir
const approvals = useMemo(() => { const approvals = useMemo(() => {
if (isLoading || !approvalLine.length || !latestApproval) { if (isLoading || !approvalLines.length || !latestApproval) {
return []; return [];
} }
try { try {
return formatGroupedApprovalsToApprovalSteps( return formatGroupedApprovalsToApprovalSteps(
approvalLine, approvalLines,
groupedApprovals, groupedApprovals,
latestApproval as BaseApproval latestApproval
); );
} catch (error) { } catch (error) {
console.warn('Gagal memformat approval steps:', error); console.warn('Gagal memformat approval steps:', error);
return []; return [];
} }
}, [isLoading, approvalLine, groupedApprovals, latestApproval]); }, [isLoading, approvalLines, groupedApprovals, latestApproval]);
// Raw Data Approvals
const rawDataApprovals = useMemo(() => { const rawDataApprovals = useMemo(() => {
const rawData = isResponseSuccess(approvalData) const rawData = isResponseSuccess(approvalData)
? approvalData.data ? approvalData.data
@@ -381,7 +358,6 @@ const useApprovalSteps = <T extends ModuleWithApproval>({
return { return {
approvals, approvals,
isLoading, isLoading,
rawData: isResponseSuccess(currentData) ? currentData.data : undefined,
rawDataApprovals: rawDataApprovals, rawDataApprovals: rawDataApprovals,
refresh, refresh,
}; };
@@ -13,6 +13,7 @@ import { useState } from 'react';
import ApprovalSteps, { import ApprovalSteps, {
useApprovalSteps, useApprovalSteps,
} from '@/components/pages/ApprovalSteps'; } from '@/components/pages/ApprovalSteps';
import { PROJECT_FLOCK_KANDANG_APPROVAL_LINE } from '@/config/approval-line';
const ChickinFormKandang = ({ const ChickinFormKandang = ({
formType = 'add', formType = 'add',
initialValues, initialValues,
@@ -29,7 +30,8 @@ const ChickinFormKandang = ({
isLoading: approvalsLoading, isLoading: approvalsLoading,
refresh: refreshApprovals, refresh: refreshApprovals,
} = useApprovalSteps({ } = useApprovalSteps({
moduleUrl: `/production/project-flock-kandangs/${initialValues?.id}`, latestApproval: initialValues?.approval,
approvalLines: PROJECT_FLOCK_KANDANG_APPROVAL_LINE,
moduleName: 'PROJECT_FLOCK_KANDANGS', moduleName: 'PROJECT_FLOCK_KANDANGS',
moduleId: initialValues?.id.toString() ?? '', moduleId: initialValues?.id.toString() ?? '',
}); });
@@ -41,6 +41,7 @@ import ProjectFlockKandangTable from './ProjectFlockKandangTable';
import ApprovalSteps, { import ApprovalSteps, {
useApprovalSteps, useApprovalSteps,
} from '@/components/pages/ApprovalSteps'; } from '@/components/pages/ApprovalSteps';
import { PROJECT_FLOCK_APPROVAL_LINE } from '@/config/approval-line';
interface ProjectFlockFormProps { interface ProjectFlockFormProps {
formType?: 'add' | 'edit' | 'detail'; formType?: 'add' | 'edit' | 'detail';
@@ -150,11 +151,11 @@ const ProjectFlockForm = ({
const { const {
approvals, approvals,
isLoading: approvalsLoading, isLoading: approvalsLoading,
rawData: rawApprovals,
rawDataApprovals: rawDataApprovals, rawDataApprovals: rawDataApprovals,
refresh: refreshApprovals, refresh: refreshApprovals,
} = useApprovalSteps({ } = useApprovalSteps({
moduleUrl: `/production/project-flocks/${initialValues?.id}`, latestApproval: initialValues?.approval,
approvalLines: PROJECT_FLOCK_APPROVAL_LINE,
moduleName: 'PROJECT_FLOCKS', moduleName: 'PROJECT_FLOCKS',
moduleId: initialValues?.id.toString() ?? '', moduleId: initialValues?.id.toString() ?? '',
}); });
+11
View File
@@ -10,3 +10,14 @@ export const PROJECT_FLOCK_APPROVAL_LINE: ApprovalLine = [
step_name: 'Aktif', step_name: 'Aktif',
}, },
] as const; ] as const;
export const PROJECT_FLOCK_KANDANG_APPROVAL_LINE: ApprovalLine = [
{
step_number: 1,
step_name: 'Pengajuan',
},
{
step_number: 2,
step_name: 'Disetujui',
},
] as const;
-46
View File
@@ -231,49 +231,3 @@ export const RECORDING_FLAG_OPTIONS = [
{ label: 'Ayam Culling', value: 'Ayam Culling' }, { label: 'Ayam Culling', value: 'Ayam Culling' },
{ label: 'Ayam Mati', value: 'Ayam Mati' }, { label: 'Ayam Mati', value: 'Ayam Mati' },
]; ];
export const APPROVAL_WORKFLOWS = [
{
key: 'PROJECT_FLOCKS',
steps: [
{
step_number: 1,
step_name: 'Pengajuan',
},
{
step_number: 2,
step_name: 'Aktif',
},
],
},
{
key: 'PROJECT_FLOCK_KANDANGS',
steps: [
{
step_number: 1,
step_name: 'Pengajuan',
},
{
step_number: 2,
step_name: 'Disetujui',
},
],
},
{
key: 'RECORDINGS',
steps: [
{
step_number: 1,
step_name: 'Grading-Telur',
},
{
step_number: 2,
step_name: 'Pengajuan',
},
{
step_number: 3,
step_name: 'Disetujui',
},
],
},
];
-4
View File
@@ -113,10 +113,6 @@ export type BaseGroupedApproval = {
approvals: BaseApproval[]; approvals: BaseApproval[];
}; };
interface ModuleWithApproval {
approval?: BaseApproval;
}
export type Approvals = BaseApiResponse<BaseApproval>; export type Approvals = BaseApiResponse<BaseApproval>;
export type GroupedApprovals = BaseApiResponse<BaseGroupedApproval[]>; export type GroupedApprovals = BaseApiResponse<BaseGroupedApproval[]>;
-14
View File
@@ -2,17 +2,3 @@ export type ApprovalLine = {
step_number: number; step_number: number;
step_name: string; step_name: string;
}[]; }[];
export interface ApprovalWorkflow {
key: string;
steps: ApprovalLine;
}
export interface AppConfigData {
approval_workflows: ApprovalWorkflow[];
flags: string[];
warehouse_types: string[];
stock_log: string;
supplier_categories: string[];
customer_supplier_types: string[];
}