summaryrefslogtreecommitdiff
path: root/components/layout/providers.tsx
blob: 11ca23f091874dd4d023bf93aa403b14e4bc0b8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
"use client"

import * as React from "react"
import { Provider as JotaiProvider } from "jotai"
import { ThemeProvider as NextThemesProvider } from "next-themes"
import { NuqsAdapter } from "nuqs/adapters/next/app"
import { SessionProvider } from "next-auth/react"
import { CacheProvider } from '@emotion/react'
import { SWRConfig } from 'swr'
import { TooltipProvider } from "@/components/ui/tooltip"
import { SessionManager } from "@/components/layout/SessionManager" // ✅ SessionManager 추가
import createEmotionCache from './createEmotionCashe'
import { PageVisitTracker } from "../tracking/page-visit-tracker"
import { NotificationProvider } from "@/lib/notification/NotificationContext"

const cache = createEmotionCache()

// 간소화된 SWR 설정
const swrConfig = {
  // 기본 동작 설정
  revalidateOnFocus: false,        // 포커스시 자동 갱신 비활성화
  revalidateOnReconnect: true,     // 재연결시 갱신 활성화
  shouldRetryOnError: false,       // 에러시 자동 재시도 비활성화 (수동으로 제어)
  dedupingInterval: 2000,          // 2초 내 중복 요청 방지
  refreshInterval: 0,              // 기본적으로 자동 갱신 비활성화 (개별 훅에서 설정)

  // 간단한 전역 에러 핸들러 (토스트 없이 로깅만)
  onError: (error: any, key: string) => {
    // 개발 환경에서만 상세 로깅
    if (process.env.NODE_ENV === 'development') {
      console.warn('SWR fetch failed:', {
        url: key,
        status: error?.status,
        message: error?.message
      })
    }

    // 401 Unauthorized의 경우 특별 처리 (선택사항)
    if (error?.status === 401) {
      console.warn('Authentication required')
      // 필요시 로그인 페이지로 리다이렉트
      // window.location.href = '/login'
    }
  },

  // 전역 성공 핸들러는 제거 (너무 많은 로그 방지)

  // 기본 fetcher 제거 (각 훅에서 개별 관리)
}

interface ThemeProviderProps extends React.ComponentProps<typeof NextThemesProvider> {
  lng?: string; // ✅ lng prop 추가
}

export function ThemeProvider({
  children,
  lng = 'ko', // ✅ 기본값 설정
  ...props
}: ThemeProviderProps) {
  return (
    <JotaiProvider>
      <CacheProvider value={cache}>
        <NextThemesProvider {...props}>
          <TooltipProvider delayDuration={0}>
            <NuqsAdapter>
              <SessionProvider>
                {/* ✅ 간소화된 SWR 설정 적용 */}
                <SWRConfig value={swrConfig}>
                  <PageVisitTracker>
                    <NotificationProvider>
                      {children}
                    </NotificationProvider>
                  </PageVisitTracker>
                  {/* ✅ SessionManager 추가 - 모든 프로바이더 내부에 위치 */}
                  <SessionManager lng={lng} />
                </SWRConfig>
              </SessionProvider>
            </NuqsAdapter>
          </TooltipProvider>
        </NextThemesProvider>
      </CacheProvider>
    </JotaiProvider>
  )
}