INIT
This commit is contained in:
72
frontend/src/contexts/AnalysisYearContext.tsx
Normal file
72
frontend/src/contexts/AnalysisYearContext.tsx
Normal 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
|
||||
}
|
||||
36
frontend/src/contexts/GlobalFilterContext.tsx
Normal file
36
frontend/src/contexts/GlobalFilterContext.tsx
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user