c4e6aab7b2
- backend/ — FastAPI + JWT + 모든 REST 엔드포인트 - frontend/ — Next.js 14 + Tailwind + 7페이지 (대시보드/트레이드/거래소/자동매매/설정/내정보/로그인) - core_logic.py — 신호계산/알림 로직 분리 (기존 app_streamlit.py 에서 추출) - users_db.py + bcrypt 인증, exchange_keys.py + Fernet 암호화 - trades_db.py — 진입/청산 lifecycle 추적, signal_events raw 로그 - settings_db.py — 모든 운영 파라미터 DB 영속 저장 (RSI/거래량/펀딩비 임계값 포함) - docker-compose: frontend / backend / postgres + Traefik 라우팅 - assets/logo.svg — JUNGGOMOA 그라디언트 로고 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
36 lines
873 B
TypeScript
36 lines
873 B
TypeScript
'use client';
|
|
import { useEffect } from 'react';
|
|
import { useRouter, usePathname } from 'next/navigation';
|
|
import { useAuth } from '@/lib/auth';
|
|
import { getToken } from '@/lib/api';
|
|
import Sidebar from './sidebar';
|
|
|
|
export default function AuthGate({ children }: { children: React.ReactNode }) {
|
|
const { user, fetchMe } = useAuth();
|
|
const router = useRouter();
|
|
const pathname = usePathname();
|
|
const isLogin = pathname === '/login';
|
|
|
|
useEffect(() => {
|
|
if (!getToken() && !isLogin) {
|
|
router.replace('/login');
|
|
return;
|
|
}
|
|
if (getToken() && !user) {
|
|
fetchMe();
|
|
}
|
|
}, [pathname]);
|
|
|
|
if (isLogin) return <>{children}</>;
|
|
if (!getToken()) return null;
|
|
|
|
return (
|
|
<div className="flex">
|
|
<Sidebar />
|
|
<main className="flex-1 min-h-screen p-4 lg:p-6 overflow-x-auto">
|
|
{children}
|
|
</main>
|
|
</div>
|
|
);
|
|
}
|