agent(협상카드 강화학습)와 anchoring(구간별 자동 조정)이 쌓아온 결과를 볼 수 있는 화면이 없어 DB 를 직접 열어야 확인이 됐다. 두 축은 성격이 달라 한 화면에 섞지 않고 탭으로 나눈다. 백엔드(읽기 전용 — 값의 주인은 agent·anchoring): - crud/learning_crud.py: learning·anchoring 스키마 경량 조회(negodata ORM 미매핑 테이블) - services/learning_service.py + router/v1/learning: /v1/learning/cards · /anchoring 프론트: - 사이드바 '협상 학습'(/learning) 추가, 탭 = 협상카드 | 앵커링 - 협상카드: 학습 협상·기록·타결 비율 요약 + 카드별 사용/타결/평균 점수(0 기준 좌우 막대) - 앵커링: 구간별 현재 인하폭 + 조정 이력(표본·성공률·값 변화) 검증: 로컬 실협상 3건으로 데이터 생성 후 두 탭 실화면 확인, tsc·eslint 통과.
56 lines
1.7 KiB
TypeScript
56 lines
1.7 KiB
TypeScript
import {Outlet, useNavigate, useLocation} from 'react-router';
|
|
import Layout from './Layout';
|
|
import {PageType} from '@/types';
|
|
import {useAuth} from '@/features/auth/useAuth';
|
|
import {showToast} from '@/lib/notify';
|
|
|
|
const PAGE_TO_PATH: Record<PageType, string> = {
|
|
DASHBOARD: '/dashboard',
|
|
STATISTICS: '/statistics',
|
|
LEARNING: '/learning',
|
|
PRODUCTS: '/products',
|
|
PARTNERS: '/partners',
|
|
QUOTATION: '/quotation',
|
|
CARDS: '/cards',
|
|
RENEGOTIATION: '/renegotiation',
|
|
MEMBERS: '/members',
|
|
DEV_SETTINGS: '/dev/settings', // /settings 보다 먼저 — startsWith 매칭이라 순서가 곧 우선순위
|
|
SETTINGS: '/settings',
|
|
DESIGN: '/dev/design',
|
|
NOTIFICATIONS: '/notifications',
|
|
};
|
|
|
|
export default function AuthenticatedLayout() {
|
|
const {user, logout} = useAuth();
|
|
const navigate = useNavigate();
|
|
const {pathname} = useLocation();
|
|
|
|
const currentPage =
|
|
(Object.keys(PAGE_TO_PATH) as PageType[]).find((page) =>
|
|
pathname.startsWith(PAGE_TO_PATH[page]),
|
|
) ?? 'PRODUCTS';
|
|
|
|
const setPage = (page: PageType) => {
|
|
navigate(PAGE_TO_PATH[page]);
|
|
};
|
|
|
|
const handleLogout = async () => {
|
|
// logout()이 상태를 비우므로 메시지에 쓸 유저 정보를 미리 잡아둔다.
|
|
const who = `${user?.company ? user.company + ' ' : ''}${user?.name ?? ''}`.trim();
|
|
// 로그아웃 완료(상태 초기화) 후 이동 — 안 그러면 /login 가드가 다시 튕겨낼 수 있다.
|
|
await logout();
|
|
showToast(who ? `${who}님, 로그아웃되었습니다.` : '로그아웃되었습니다.', 'info');
|
|
navigate('/login');
|
|
};
|
|
|
|
return (
|
|
<Layout
|
|
currentPage={currentPage}
|
|
setPage={setPage}
|
|
onLogout={handleLogout}
|
|
>
|
|
<Outlet />
|
|
</Layout>
|
|
);
|
|
}
|