Layout.tsx 1.3 KB

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