chore(WEB): actions.ts 에러 핸들링 및 CEO 대시보드 개선

- 전체 모듈 actions.ts redirect 에러 핸들링 추가
- CEODashboard DetailModal 추가
- MonthlyExpenseSection 개선
- fetch-wrapper redirect 에러 처리
- redirect-error 유틸 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
byeongcheolryu
2026-01-08 18:41:15 +09:00
parent 9885085259
commit 0d539628f3
61 changed files with 1226 additions and 359 deletions

View File

@@ -14,7 +14,7 @@
'use server';
import { isRedirectError } from 'next/dist/client/components/redirect';
import { isNextRedirectError } from '@/lib/utils/redirect-error';
import { serverFetch } from '@/lib/api/fetch-wrapper';
import type { PricingData, ItemInfo } from './types';
@@ -197,7 +197,7 @@ export async function getPricingById(id: string): Promise<PricingData | null> {
return transformApiToFrontend(result.data);
} catch (error) {
if (isRedirectError(error)) throw error;
if (isNextRedirectError(error)) throw error;
console.error('[PricingActions] getPricingById error:', error);
return null;
}
@@ -248,7 +248,7 @@ export async function getItemInfo(itemId: string): Promise<ItemInfo | null> {
unit: item.unit || 'EA',
};
} catch (error) {
if (isRedirectError(error)) throw error;
if (isNextRedirectError(error)) throw error;
console.error('[PricingActions] getItemInfo error:', error);
return null;
}
@@ -304,7 +304,7 @@ export async function createPricing(
data: transformApiToFrontend(result.data),
};
} catch (error) {
if (isRedirectError(error)) throw error;
if (isNextRedirectError(error)) throw error;
console.error('[PricingActions] createPricing error:', error);
return {
success: false,
@@ -367,7 +367,7 @@ export async function updatePricing(
data: transformApiToFrontend(result.data),
};
} catch (error) {
if (isRedirectError(error)) throw error;
if (isNextRedirectError(error)) throw error;
console.error('[PricingActions] updatePricing error:', error);
return {
success: false,
@@ -415,7 +415,7 @@ export async function deletePricing(id: string): Promise<{ success: boolean; err
return { success: true };
} catch (error) {
if (isRedirectError(error)) throw error;
if (isNextRedirectError(error)) throw error;
console.error('[PricingActions] deletePricing error:', error);
return {
success: false,
@@ -466,7 +466,7 @@ export async function finalizePricing(id: string): Promise<{ success: boolean; d
data: transformApiToFrontend(result.data),
};
} catch (error) {
if (isRedirectError(error)) throw error;
if (isNextRedirectError(error)) throw error;
console.error('[PricingActions] finalizePricing error:', error);
return {
success: false,
@@ -547,7 +547,7 @@ export async function getPricingRevisions(priceId: string): Promise<{
data: revisions,
};
} catch (error) {
if (isRedirectError(error)) throw error;
if (isNextRedirectError(error)) throw error;
console.error('[PricingActions] getPricingRevisions error:', error);
return {
success: false,