Layout.tsx 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. 'use client';
  2. import { useState, useCallback } from 'react';
  3. import Link from 'next/link'
  4. import Styles from '../styles/layout.module.scss';
  5. import Header from './Header';
  6. import Footer from './Footer'
  7. import ChannelSidebar from '@/app/component/channel/ChannelSidebar';
  8. type Props = {
  9. children: React.ReactNode;
  10. };
  11. export default function Layout({ children }: Props) {
  12. const [sidebarOpen, setSidebarOpen] = useState(false);
  13. const toggleSidebar = useCallback(() => {
  14. setSidebarOpen((prev) => !prev);
  15. }, []);
  16. const closeOverlay = useCallback(() => {
  17. setSidebarOpen(false);
  18. }, []);
  19. return (
  20. <>
  21. <div id='container' className={`${Styles.container}${sidebarOpen ? ` ${Styles.sidebarOpen}` : ''}`}>
  22. <Header sidebarOpen={sidebarOpen} onToggle={toggleSidebar} />
  23. {/* 모바일 오버레이 */}
  24. <div className={Styles.overlay} onClick={closeOverlay} />
  25. {/* 좌측 채널 사이드바 */}
  26. <aside id='aside' className={Styles.aside}>
  27. <ChannelSidebar />
  28. </aside>
  29. {/* 메인 내용 */}
  30. <main id='main' className={`${Styles.main} relative`}>
  31. {children}
  32. </main>
  33. {/* 하단 */}
  34. <Footer />
  35. </div>
  36. </>
  37. );
  38. }