해당 기능은 공통업무 기능입니다.
다음과 같이 미리 준비된 Boilerplate confy-app 형태로 제공됩니다.
전역 상태관리는 zustand 라이브러리를 사용하여 구현되어 있습니다.
/src/store/SiteStore.ts 스토어 작성
import { create } from 'zustand'
interface SiteData {
siteInfo: any // 실제 타입에 맞게 정의하세요
isLoading: boolean
error: string | null
}
interface SiteStore extends SiteData {
setSiteData: (data: any) => void
fetchSiteData: (token: string) => Promise<void>
}
export const useSiteStore = create<SiteStore>((set) => ({
siteInfo: null,
isLoading: false,
error: null,
setSiteData: (data) => set({ siteInfo: data }),
fetchSiteData: async (token) => {
try {
set({ isLoading: true, error: null })
const response = await fetch('http://localhost:3300/auth/get-me', {
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json'
}
})
const { data } = await response.json()
console.log('사이트 데이터 로딩 성공 data: ', data)
set({ siteInfo: data, isLoading: false })
} catch (error) {
set({ error: '사이트 데이터 로딩 실패', isLoading: false })
}
}
}))
/src/app/dashboard/page.ts 스토어 사용
'use client'
import { useSiteStore } from '@/store/siteStore'
import { signOut, useSession } from 'next-auth/react'
import { redirect } from 'next/navigation'
export default function DashboardPage() {
const { data: session } = useSession()
const { siteInfo, isLoading, error } = useSiteStore()
if (!session) {
redirect('/login')
}
if (isLoading) {
return <div>로딩 중...</div>
}
if (error) {
return <div>에러: {error}</div>
}
return (
<div className='p-8'>
<h1 className='text-2xl font-bold'>대시보드</h1>
<button onClick={() => signOut()}>로그아웃</button>
<p>환영합니다. </p>
<p>이메일: {session.user.email}</p>
<h1>저장된 사이트 데이터</h1>
<pre>{JSON.stringify(siteInfo, null, 2)}</pre>
</div>
)
}