From e386d2a3892db60d17d6b917febcd79a0077b562 Mon Sep 17 00:00:00 2001 From: rstubryan Date: Fri, 23 Jan 2026 18:12:44 +0700 Subject: [PATCH] chore(FE-Cleanup): Clean up unused code and add memoization --- .../HppExpeditionReportTable.tsx | 1 - .../pages/closing/sale/SalesReportTable.tsx | 6 +---- .../pages/expense/ExpenseRequestContent.tsx | 7 +---- .../pages/expense/ExpensesTable.tsx | 27 ------------------- ...ExpenseRealizationKandangDetailExpense.tsx | 2 +- .../inventory/movement/form/MovementForm.tsx | 23 ++++++++-------- .../master-data/product/form/ProductForm.tsx | 4 +-- .../recording/form/RecordingForm.tsx | 8 ------ .../production/uniformity/UniformityTable.tsx | 2 -- .../uniformity/chart/UniformityGaugeChart.tsx | 2 +- .../uniformity/form/UniformityForm.tsx | 6 +---- .../skeleton/UniformityGaugeChartSkeleton.tsx | 2 +- 12 files changed, 19 insertions(+), 71 deletions(-) diff --git a/src/components/pages/closing/hpp-ekspedisi/HppExpeditionReportTable.tsx b/src/components/pages/closing/hpp-ekspedisi/HppExpeditionReportTable.tsx index f683ec58..da89d963 100644 --- a/src/components/pages/closing/hpp-ekspedisi/HppExpeditionReportTable.tsx +++ b/src/components/pages/closing/hpp-ekspedisi/HppExpeditionReportTable.tsx @@ -13,7 +13,6 @@ interface HppExpeditionReportTableProps { } const HppExpeditionReportTable = ({ - type = 'detail', initialValues, }: HppExpeditionReportTableProps) => { const costOfRevenueExpeditionData: BaseExpeditionCost[] = useMemo(() => { diff --git a/src/components/pages/closing/sale/SalesReportTable.tsx b/src/components/pages/closing/sale/SalesReportTable.tsx index 99868984..0632676b 100644 --- a/src/components/pages/closing/sale/SalesReportTable.tsx +++ b/src/components/pages/closing/sale/SalesReportTable.tsx @@ -4,7 +4,6 @@ import React, { useMemo } from 'react'; import { ColumnDef } from '@tanstack/react-table'; import Table from '@/components/Table'; import Card from '@/components/Card'; -import Badge from '@/components/Badge'; import { formatCurrency, formatNumber, formatDate } from '@/lib/helper'; import { BaseClosingSales, @@ -20,10 +19,7 @@ interface SalesReportTableProps { initialValues?: BaseClosingSales; } -const SalesReportTable = ({ - type = 'detail', - initialValues, -}: SalesReportTableProps) => { +const SalesReportTable = ({ initialValues }: SalesReportTableProps) => { const salesData: BaseSales[] = useMemo(() => { return initialValues?.sales || []; }, [initialValues]); diff --git a/src/components/pages/expense/ExpenseRequestContent.tsx b/src/components/pages/expense/ExpenseRequestContent.tsx index ac814bcf..6513956e 100644 --- a/src/components/pages/expense/ExpenseRequestContent.tsx +++ b/src/components/pages/expense/ExpenseRequestContent.tsx @@ -1,9 +1,8 @@ 'use client'; -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import { useRouter } from 'next/navigation'; import { useFormik } from 'formik'; -import useSWR from 'swr'; import toast from 'react-hot-toast'; import { Icon } from '@iconify/react'; @@ -57,10 +56,6 @@ const ExpenseRequestContent = ({ const isLatestApprovalRejected = initialValues?.latest_approval.action === 'REJECTED'; - const isLatestApprovalRejectedOrDone = - isLatestApprovalRejected || - initialValues?.latest_approval.step_number === 6; - const isCurrentApprovalOnHeadArea = !isLatestApprovalRejected && initialValues?.latest_approval.step_number === 1; diff --git a/src/components/pages/expense/ExpensesTable.tsx b/src/components/pages/expense/ExpensesTable.tsx index 895c0997..69376992 100644 --- a/src/components/pages/expense/ExpensesTable.tsx +++ b/src/components/pages/expense/ExpensesTable.tsx @@ -35,7 +35,6 @@ import { ExpenseApi } from '@/services/api/expense'; import { cn, formatCurrency, formatDate } from '@/lib/helper'; import { isResponseSuccess } from '@/lib/api-helper'; import { useTableFilter } from '@/services/hooks/useTableFilter'; -import { ROWS_OPTIONS } from '@/config/constant'; import { LocationApi, SupplierApi } from '@/services/api/master-data'; import { Location } from '@/types/api/master-data/location'; import { Supplier } from '@/types/api/master-data/supplier'; @@ -44,8 +43,6 @@ import { BaseApiResponse } from '@/types/api/api-general'; const RowOptionsMenu = ({ type = 'dropdown', props, - approveClickHandler, - rejectClickHandler, deleteClickHandler, }: { type: 'dropdown' | 'collapse'; @@ -186,7 +183,6 @@ const ExpensesTable = () => { undefined ); const [isDeleteLoading, setIsDeleteLoading] = useState(false); - const [isCompleteLoading, setIsCompleteLoading] = useState(false); const [isApproveLoading, setIsApproveLoading] = useState(false); const [isRejectLoading, setIsRejectLoading] = useState(false); @@ -247,23 +243,6 @@ const ExpensesTable = () => { }); }, [expenses, selectedRowIds]); - const isAllSelectedRowLatestApprovalOnRealization = useMemo(() => { - return selectedRowIds.every((rowId) => { - if (!isResponseSuccess(expenses)) return false; - - const expenseItem = expenses.data.find((item) => item.id === rowId); - - const isLatestApprovalRejected = - expenseItem?.latest_approval.action === 'REJECTED'; - - const isCurrentApprovalOnRealization = - !isLatestApprovalRejected && - expenseItem?.latest_approval.step_number === 5; - - return isCurrentApprovalOnRealization; - }); - }, [expenses, selectedRowIds]); - const expensesColumns: ColumnDef[] = [ { id: 'select', @@ -589,12 +568,6 @@ const ExpensesTable = () => { updateFilter('realizationDate', e.target.value); }; - const pageSizeChangeHandler = (val: OptionType | OptionType[] | null) => { - const newVal = val as OptionType; - - setPageSize(newVal.value as number); - }; - // track sorting useEffect(() => { const isNameSorted = sorting.find((sortItem) => sortItem.id === 'name'); diff --git a/src/components/pages/expense/form/ExpenseRealizationKandangDetailExpense.tsx b/src/components/pages/expense/form/ExpenseRealizationKandangDetailExpense.tsx index 3f6f2220..fcf367eb 100644 --- a/src/components/pages/expense/form/ExpenseRealizationKandangDetailExpense.tsx +++ b/src/components/pages/expense/form/ExpenseRealizationKandangDetailExpense.tsx @@ -30,7 +30,7 @@ interface ExpenseRealizationKandangDetailExpenseProps { const ExpenseRealizationKandangDetailExpense: React.FC< ExpenseRealizationKandangDetailExpenseProps -> = ({ type, formik, supplierId, location, className }) => { +> = ({ formik, supplierId, location, className }) => { const { setInputValue: setNonstockInputValue, options: nonstockOptions, diff --git a/src/components/pages/inventory/movement/form/MovementForm.tsx b/src/components/pages/inventory/movement/form/MovementForm.tsx index b6a40cc3..bdf37487 100644 --- a/src/components/pages/inventory/movement/form/MovementForm.tsx +++ b/src/components/pages/inventory/movement/form/MovementForm.tsx @@ -2,7 +2,6 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useFormik } from 'formik'; -import useSWR from 'swr'; import { Icon } from '@iconify/react'; import Button from '@/components/Button'; @@ -326,16 +325,18 @@ const MovementForm = ({ type = 'add', initialValues }: MovementFormProps) => { } ); - const productWarehouseOptions = isResponseSuccess(productWarehouses) - ? productWarehouses?.data.map((pw) => ({ - value: pw.product.id, - label: pw.product.name, - product_id: pw.product.id, - warehouse_id: pw.warehouse.id, - warehouse_name: pw.warehouse.name, - quantity: pw.quantity, - })) - : []; + const productWarehouseOptions = useMemo(() => { + return isResponseSuccess(productWarehouses) + ? productWarehouses?.data.map((pw) => ({ + value: pw.product.id, + label: pw.product.name, + product_id: pw.product.id, + warehouse_id: pw.warehouse.id, + warehouse_name: pw.warehouse.name, + quantity: pw.quantity, + })) + : []; + }, [productWarehouses]); // ===== HELPER FUNCTIONS ===== const isRepeaterInputError = ( diff --git a/src/components/pages/master-data/product/form/ProductForm.tsx b/src/components/pages/master-data/product/form/ProductForm.tsx index 8c04d594..45ba192d 100644 --- a/src/components/pages/master-data/product/form/ProductForm.tsx +++ b/src/components/pages/master-data/product/form/ProductForm.tsx @@ -4,7 +4,6 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { useRouter } from 'next/navigation'; import { useFormik } from 'formik'; import { toast } from 'react-hot-toast'; -import useSWR from 'swr'; import { Icon } from '@iconify/react'; import Button from '@/components/Button'; @@ -17,7 +16,6 @@ import SelectInput, { import { useModal } from '@/components/Modal'; import ConfirmationModal from '@/components/modal/ConfirmationModal'; import RequirePermission from '@/components/helper/RequirePermission'; -import { getUniqueFormikErrors } from '@/lib/formik-helper'; import AlertErrorList from '@/components/helper/form/FormErrors'; import { @@ -25,7 +23,7 @@ import { ProductFormValues, UpdateProductFormSchema, } from '@/components/pages/master-data/product/form/ProductForm.schema'; -import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; +import { isResponseError } from '@/lib/api-helper'; import { Product, CreateProductPayload, diff --git a/src/components/pages/production/recording/form/RecordingForm.tsx b/src/components/pages/production/recording/form/RecordingForm.tsx index a000f4a3..63d78397 100644 --- a/src/components/pages/production/recording/form/RecordingForm.tsx +++ b/src/components/pages/production/recording/form/RecordingForm.tsx @@ -71,7 +71,6 @@ import { import { isResponseSuccess, isResponseError } from '@/lib/api-helper'; import { formatDate, formatNumber } from '@/lib/helper'; -import { getUniqueFormikErrors } from '@/lib/formik-helper'; import toast from 'react-hot-toast'; import ApprovalSteps, { useApprovalSteps, @@ -423,7 +422,6 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { options: locationOptions, isLoadingOptions: isLoadingLocations, loadMore: loadMoreLocations, - hasMore: hasMoreLocations, } = useSelect(LocationApi.basePath, 'id', 'name', 'search'); const { @@ -432,7 +430,6 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { rawData: projectFlocksRawData, isLoadingOptions: isLoadingProjectFlocks, loadMore: loadMoreProjectFlocks, - hasMore: hasMoreProjectFlocks, } = useSelect(ProjectFlockApi.basePath, 'id', 'flock_name', 'search', { location_id: selectedProjectFlockLocationId, }); @@ -531,7 +528,6 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { rawData: stockProducts, isLoadingOptions: isLoadingStockProducts, loadMore: loadMoreStockProducts, - hasMore: hasMoreStockProducts, } = useSelect(ProductWarehouseApi.basePath, 'id', 'product.name', '', { flags: 'PAKAN,OVK', location_id: stockProductsLocationId, @@ -539,11 +535,9 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { }); const { - options: depletionProductOptions, rawData: depletionProductsData, isLoadingOptions: isLoadingDepletionProducts, loadMore: loadMoreDepletionProducts, - hasMore: hasMoreDepletionProducts, } = useSelect(ProductWarehouseApi.basePath, 'id', 'product.name', '', { location_id: depletionProductsLocationId, kandang_id: depletionProductsKandangId, @@ -584,11 +578,9 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => { }, [nextDayRecordingData]); const { - options: eggProductOptions, rawData: eggProductsData, isLoadingOptions: isLoadingEggProducts, loadMore: loadMoreEggProducts, - hasMore: hasMoreEggProducts, } = useSelect(ProductWarehouseApi.basePath, 'id', 'product.name', 'search', { search: 'telur', location_id: eggProductsLocationId, diff --git a/src/components/pages/production/uniformity/UniformityTable.tsx b/src/components/pages/production/uniformity/UniformityTable.tsx index c2049ab1..fafa3d77 100644 --- a/src/components/pages/production/uniformity/UniformityTable.tsx +++ b/src/components/pages/production/uniformity/UniformityTable.tsx @@ -241,7 +241,6 @@ const UniformityTable = () => { options: filterLocationOptions, isLoadingOptions: isLoadingFilterLocations, loadMore: loadMoreFilterLocations, - hasMore: hasMoreFilterLocations, } = useSelect(LocationApi.basePath, 'id', 'name', 'search'); // ===== FETCH PROJECT FLOCKS DATA FOR FILTER ===== @@ -251,7 +250,6 @@ const UniformityTable = () => { rawData: filterProjectFlocksRawData, isLoadingOptions: isLoadingFilterProjectFlocks, loadMore: loadMoreFilterProjectFlocks, - hasMore: hasMoreFilterProjectFlocks, } = useSelect(ProjectFlockApi.basePath, 'id', 'flock_name', 'search', { location_id: filterProjectFlockLocationId, }); diff --git a/src/components/pages/production/uniformity/chart/UniformityGaugeChart.tsx b/src/components/pages/production/uniformity/chart/UniformityGaugeChart.tsx index 04fbef9c..54f8e4ec 100644 --- a/src/components/pages/production/uniformity/chart/UniformityGaugeChart.tsx +++ b/src/components/pages/production/uniformity/chart/UniformityGaugeChart.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React from 'react'; import { Cell, Pie, PieChart, ResponsiveContainer } from 'recharts'; import Card from '@/components/Card'; import { formatNumber } from '@/lib/helper'; diff --git a/src/components/pages/production/uniformity/form/UniformityForm.tsx b/src/components/pages/production/uniformity/form/UniformityForm.tsx index f46a15b3..ae687213 100644 --- a/src/components/pages/production/uniformity/form/UniformityForm.tsx +++ b/src/components/pages/production/uniformity/form/UniformityForm.tsx @@ -87,9 +87,7 @@ const UniformityForm = ({ const fileInputRef = useRef(null); // ===== SELECT INPUT DATA ===== - const [selectedLocation, setSelectedLocation] = useState( - null - ); + const [, setSelectedLocation] = useState(null); const [selectedProjectFlockLocationId, setSelectedProjectFlockLocationId] = useState(''); @@ -106,7 +104,6 @@ const UniformityForm = ({ options: locationOptions, isLoadingOptions: isLoadingLocations, loadMore: loadMoreLocations, - hasMore: hasMoreLocations, } = useSelect(LocationApi.basePath, 'id', 'name', 'search'); const { @@ -115,7 +112,6 @@ const UniformityForm = ({ rawData: projectFlocksRawData, isLoadingOptions: isLoadingProjectFlocks, loadMore: loadMoreProjectFlocks, - hasMore: hasMoreProjectFlocks, } = useSelect(ProjectFlockApi.basePath, 'id', 'flock_name', 'search', { location_id: selectedProjectFlockLocationId, }); diff --git a/src/components/pages/production/uniformity/skeleton/UniformityGaugeChartSkeleton.tsx b/src/components/pages/production/uniformity/skeleton/UniformityGaugeChartSkeleton.tsx index 436fab9a..d9031163 100644 --- a/src/components/pages/production/uniformity/skeleton/UniformityGaugeChartSkeleton.tsx +++ b/src/components/pages/production/uniformity/skeleton/UniformityGaugeChartSkeleton.tsx @@ -29,7 +29,7 @@ const UniformityGaugeChartSkeleton: React.FC< return (
-
+