diff --git a/src/components/accounting/SalesManagement/actions.ts b/src/components/accounting/SalesManagement/actions.ts
index 1b337efc..a2d6fea8 100644
--- a/src/components/accounting/SalesManagement/actions.ts
+++ b/src/components/accounting/SalesManagement/actions.ts
@@ -211,7 +211,15 @@ export async function toggleSaleIssuance(
? { taxInvoiceIssued: value }
: { transactionStatementIssued: value };
- return updateSale(id, updateData);
+ try {
+ return await updateSale(id, updateData);
+ } catch (error) {
+ // 인증 만료 등으로 인한 리다이렉트 에러 → 페이지 이동 없이 에러 반환
+ if (isNextRedirectError(error)) {
+ return { success: false, error: '세션이 만료되었습니다. 다시 로그인해주세요.' };
+ }
+ throw error;
+ }
}
// ===== 매출 삭제 =====
diff --git a/src/components/accounting/SalesManagement/index.tsx b/src/components/accounting/SalesManagement/index.tsx
index 2e51189e..f0c5541f 100644
--- a/src/components/accounting/SalesManagement/index.tsx
+++ b/src/components/accounting/SalesManagement/index.tsx
@@ -14,7 +14,7 @@
* - deleteConfirmMessage로 삭제 다이얼로그 처리
*/
-import { useState, useMemo, useCallback, useTransition } from 'react';
+import { useState, useMemo, useCallback } from 'react';
import { useRouter } from 'next/navigation';
import { toast } from 'sonner';
import {
@@ -92,7 +92,6 @@ interface SalesManagementProps {
export function SalesManagement({ initialData, initialPagination }: SalesManagementProps) {
const router = useRouter();
- const [isPending, startTransition] = useTransition();
// ===== 외부 상태 (UniversalListPage 외부에서 관리) =====
const [startDate, setStartDate] = useState('2025-01-01');
@@ -192,35 +191,31 @@ export function SalesManagement({ initialData, initialPagination }: SalesManagem
router.push('/ko/accounting/sales?mode=new');
}, [router]);
- // 토글 핸들러
- const handleTaxInvoiceToggle = useCallback((itemId: string, checked: boolean) => {
+ // 토글 핸들러 (Optimistic UI: 먼저 UI 업데이트 → API 호출 → 실패 시 롤백)
+ const handleTaxInvoiceToggle = useCallback(async (itemId: string, checked: boolean) => {
setSalesData(prev => prev.map(item =>
item.id === itemId ? { ...item, taxInvoiceIssued: checked } : item
));
- startTransition(async () => {
- const result = await toggleSaleIssuance(itemId, 'taxInvoiceIssued', checked);
- if (!result.success) {
- setSalesData(prev => prev.map(item =>
- item.id === itemId ? { ...item, taxInvoiceIssued: !checked } : item
- ));
- toast.error(result.error || '세금계산서 발행 상태 변경에 실패했습니다.');
- }
- });
+ const result = await toggleSaleIssuance(itemId, 'taxInvoiceIssued', checked);
+ if (!result.success) {
+ setSalesData(prev => prev.map(item =>
+ item.id === itemId ? { ...item, taxInvoiceIssued: !checked } : item
+ ));
+ toast.error(result.error || '세금계산서 발행 상태 변경에 실패했습니다.');
+ }
}, []);
- const handleTransactionStatementToggle = useCallback((itemId: string, checked: boolean) => {
+ const handleTransactionStatementToggle = useCallback(async (itemId: string, checked: boolean) => {
setSalesData(prev => prev.map(item =>
item.id === itemId ? { ...item, transactionStatementIssued: checked } : item
));
- startTransition(async () => {
- const result = await toggleSaleIssuance(itemId, 'transactionStatementIssued', checked);
- if (!result.success) {
- setSalesData(prev => prev.map(item =>
- item.id === itemId ? { ...item, transactionStatementIssued: !checked } : item
- ));
- toast.error(result.error || '거래명세서 발행 상태 변경에 실패했습니다.');
- }
- });
+ const result = await toggleSaleIssuance(itemId, 'transactionStatementIssued', checked);
+ if (!result.success) {
+ setSalesData(prev => prev.map(item =>
+ item.id === itemId ? { ...item, transactionStatementIssued: !checked } : item
+ ));
+ toast.error(result.error || '거래명세서 발행 상태 변경에 실패했습니다.');
+ }
}, []);
// 계정과목명 저장 핸들러
@@ -265,8 +260,8 @@ export function SalesManagement({ initialData, initialPagination }: SalesManagem
getList: async () => {
return {
success: true,
- data: initialData,
- totalCount: initialData.length,
+ data: salesData,
+ totalCount: salesData.length,
};
},
deleteItem: async (id: string) => {
@@ -531,7 +526,7 @@ export function SalesManagement({ initialData, initialPagination }: SalesManagem
),
}),
[
- initialData,
+ salesData,
startDate,
endDate,
stats,
@@ -550,7 +545,7 @@ export function SalesManagement({ initialData, initialPagination }: SalesManagem
return (
<>
-
+
{/* 계정과목명 저장 확인 다이얼로그 */}