refactor(WEB): 공통 훅(useDeleteDialog, useStatsLoader) 및 CRUD 서비스 추출

- useDeleteDialog 훅 추출로 삭제 다이얼로그 로직 공통화
- useStatsLoader 훅 추출로 통계 로딩 패턴 공통화
- create-crud-service 유틸 추가
- 차량관리/견적/출고/검사 등 리스트 컴포넌트 간소화
- RankManagement actions 정리
- 프로덕션 로거 불필요 출력 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-02-09 20:42:05 +09:00
parent 3ea6a57a10
commit 4d79b178e3
22 changed files with 588 additions and 619 deletions

View File

@@ -12,8 +12,9 @@
* - 하단 출고 스케줄 캘린더 (시간축 주간 뷰)
*/
import { useState, useEffect, useMemo, useCallback } from 'react';
import { useState, useMemo, useCallback } from 'react';
import { useRouter } from 'next/navigation';
import { useStatsLoader } from '@/hooks/useStatsLoader';
import {
Truck,
Package,
@@ -53,7 +54,7 @@ export function ShipmentList() {
const router = useRouter();
// ===== 통계 (외부 관리) =====
const [shipmentStats, setShipmentStats] = useState<ShipmentStats | null>(null);
const { data: shipmentStats, reload: reloadStats } = useStatsLoader(getShipmentStats);
// ===== 날짜 범위 =====
const today = new Date();
@@ -71,22 +72,6 @@ export function ShipmentList() {
const [scheduleView, setScheduleView] = useState<CalendarView>('day-time');
const [shipmentData, setShipmentData] = useState<ShipmentItem[]>([]);
// 초기 통계 로드
useEffect(() => {
const loadStats = async () => {
try {
const statsResult = await getShipmentStats();
if (statsResult.success && statsResult.data) {
setShipmentStats(statsResult.data);
}
} catch (error) {
if (isNextRedirectError(error)) throw error;
console.error('[ShipmentList] loadStats error:', error);
}
};
loadStats();
}, []);
// ===== 행 클릭 핸들러 =====
const handleRowClick = useCallback(
(item: ShipmentItem) => {
@@ -191,10 +176,7 @@ export function ShipmentList() {
if (result.success) {
// 통계 다시 로드
const statsResult = await getShipmentStats();
if (statsResult.success && statsResult.data) {
setShipmentStats(statsResult.data);
}
await reloadStats();
// 캘린더용 데이터 저장
setShipmentData(result.data);