refactor(WEB): 프론트엔드 대규모 코드 정리 및 리팩토링

- 미사용 코드 삭제: ThemeContext, itemStore, utils/date.ts, utils/formatAmount.ts
- 유틸리티 이동: date, formatAmount → src/lib/utils/ (중앙 집중화)
- 다수 page.tsx 클라이언트 컴포넌트 패턴 통일
- DateRangeSelector 리팩토링 및 date-range-picker UI 컴포넌트 추가
- ThemeSelect/themeStore Zustand 직접 연동으로 전환
- 건설/회계/영업/품목/출하 등 전반적 컴포넌트 개선
- UniversalListPage, IntegratedListTemplateV2 타입 확장
- 프론트엔드 종합 리뷰 문서 및 개선 체크리스트 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-02-19 16:30:07 +09:00
parent b8dcb69e47
commit a2c3e4c41e
136 changed files with 1987 additions and 896 deletions

View File

@@ -1,57 +0,0 @@
"use client";
import { createContext, useContext, useState, useEffect, ReactNode } from "react";
type Theme = "light" | "dark" | "senior";
interface ThemeContextType {
theme: Theme;
setTheme: (theme: Theme) => void;
}
const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
export function ThemeProvider({ children }: { children: ReactNode }) {
const [theme, setThemeState] = useState<Theme>("light");
useEffect(() => {
// Load theme from localStorage on mount
const savedTheme = localStorage.getItem("theme") as Theme;
if (savedTheme) {
setThemeState(savedTheme);
applyTheme(savedTheme);
}
}, []);
const setTheme = (newTheme: Theme) => {
if (typeof window === 'undefined') return;
setThemeState(newTheme);
localStorage.setItem("theme", newTheme);
applyTheme(newTheme);
};
const applyTheme = (theme: Theme) => {
if (typeof window === 'undefined') return;
const root = document.documentElement;
// Remove all theme classes
root.classList.remove("light", "dark", "senior");
// Add new theme class
root.classList.add(theme);
};
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
{children}
</ThemeContext.Provider>
);
}
export function useTheme() {
const context = useContext(ThemeContext);
if (context === undefined) {
throw new Error("useTheme must be used within a ThemeProvider");
}
return context;
}