This commit is contained in:
2025-12-09 17:02:27 +09:00
parent 26f8e1dab2
commit 83127da569
275 changed files with 139682 additions and 1 deletions

View File

@@ -0,0 +1,72 @@
'use client'
import React, { createContext, useContext, useState, useEffect, Suspense } from 'react'
import { useRouter, useSearchParams, usePathname } from 'next/navigation'
interface AnalysisYearContextType {
selectedYear: number
setSelectedYear: (year: number) => void
availableYears: number[]
}
const AnalysisYearContext = createContext<AnalysisYearContextType | undefined>(undefined)
function AnalysisYearProviderInner({ children }: { children: React.ReactNode }) {
const router = useRouter()
const pathname = usePathname()
const searchParams = useSearchParams()
// 사용 가능한 분석 연도 목록 (현재 연도부터 과거 5년)
const currentYear = new Date().getFullYear()
const availableYears = Array.from({ length: 6 }, (_, i) => currentYear - i)
// URL 파라미터에서 연도 가져오기, 없으면 현재 연도 사용
const yearFromUrl = searchParams.get('year')
const initialYear = yearFromUrl && !isNaN(Number(yearFromUrl))
? Number(yearFromUrl)
: currentYear
const [selectedYear, setSelectedYearState] = useState<number>(initialYear)
// URL 파라미터와 동기화
useEffect(() => {
const yearParam = searchParams.get('year')
if (yearParam && !isNaN(Number(yearParam))) {
const year = Number(yearParam)
if (availableYears.includes(year)) {
setSelectedYearState(year)
}
}
}, [searchParams, availableYears])
const setSelectedYear = (year: number) => {
setSelectedYearState(year)
// URL 파라미터 업데이트
const params = new URLSearchParams(searchParams.toString())
params.set('year', year.toString())
router.push(`${pathname}?${params.toString()}`)
}
return (
<AnalysisYearContext.Provider value={{ selectedYear, setSelectedYear, availableYears }}>
{children}
</AnalysisYearContext.Provider>
)
}
export function AnalysisYearProvider({ children }: { children: React.ReactNode }) {
return (
<Suspense fallback={null}>
<AnalysisYearProviderInner>{children}</AnalysisYearProviderInner>
</Suspense>
)
}
export function useAnalysisYear() {
const context = useContext(AnalysisYearContext)
if (context === undefined) {
throw new Error('useAnalysisYear must be used within an AnalysisYearProvider')
}
return context
}

View File

@@ -0,0 +1,36 @@
'use client'
import { createContext, useContext, ReactNode } from 'react'
import { useFilterStore } from '@/store/filter-store'
import { GlobalFilterSettings } from '@/types/filter.types'
/**
* GlobalFilterContext - Zustand store 래퍼
* 기존 코드 호환성을 위해 Context API 인터페이스 유지
*/
interface GlobalFilterContextType {
filters: GlobalFilterSettings
updateFilters: (newFilters: Partial<GlobalFilterSettings>) => void
resetFilters: () => void
isLoading: boolean
}
const GlobalFilterContext = createContext<GlobalFilterContextType | undefined>(undefined)
export function GlobalFilterProvider({ children }: { children: ReactNode }) {
const { filters, updateFilters, resetFilters, isLoading } = useFilterStore()
return (
<GlobalFilterContext.Provider value={{ filters, updateFilters, resetFilters, isLoading }}>
{children}
</GlobalFilterContext.Provider>
)
}
export function useGlobalFilter() {
const context = useContext(GlobalFilterContext)
if (context === undefined) {
throw new Error('useGlobalFilter must be used within a GlobalFilterProvider')
}
return context
}