diff --git a/src/components/layout/footer/footer.tsx b/src/components/layout/footer/footer.tsx index d4de13d..ff7d751 100644 --- a/src/components/layout/footer/footer.tsx +++ b/src/components/layout/footer/footer.tsx @@ -11,10 +11,10 @@ const Footer = () => { ©codeit - 2023
- + Privacy Policy - + FAQ
diff --git a/src/components/layout/footer/index.ts b/src/components/layout/footer/index.ts index e69de29..13f355b 100644 --- a/src/components/layout/footer/index.ts +++ b/src/components/layout/footer/index.ts @@ -0,0 +1 @@ +export { default as Footer } from './footer'; diff --git a/src/components/layout/frame/index.ts b/src/components/layout/frame/index.ts index e69de29..1a4475a 100644 --- a/src/components/layout/frame/index.ts +++ b/src/components/layout/frame/index.ts @@ -0,0 +1 @@ +export { default as Frame } from './frame'; diff --git a/src/components/layout/index.ts b/src/components/layout/index.ts index 7dda070..0232f88 100644 --- a/src/components/layout/index.ts +++ b/src/components/layout/index.ts @@ -1,2 +1,4 @@ export { Container, Wrapper } from './container'; +export { Footer } from './footer'; +export { Frame } from './frame'; export { Header } from './header'; diff --git a/src/components/ui/pagination/index.ts b/src/components/ui/pagination/index.ts new file mode 100644 index 0000000..9128b29 --- /dev/null +++ b/src/components/ui/pagination/index.ts @@ -0,0 +1 @@ +export { default as Pagination } from './pagination'; diff --git a/src/components/ui/pagination/pagination.tsx b/src/components/ui/pagination/pagination.tsx new file mode 100644 index 0000000..a634c4b --- /dev/null +++ b/src/components/ui/pagination/pagination.tsx @@ -0,0 +1,74 @@ +import { Icon } from '@/components/ui'; +import { useEffect, useState } from 'react'; + +const PAGE_GROUP_SIZE = 7; + +interface PaginationProps { + totalItems: number; + currentPage: number; + itemsPerPage: number; + onPageChange: (page: number) => void; +} +// totalItems 는 API 통신 시 Response 로 받는 """count""" 부모로부터 넘겨주기! + +const Pagination = ({ totalItems, currentPage, itemsPerPage, onPageChange }: PaginationProps) => { + const [pageGroup, setPageGroup] = useState(0); + + const totalPages = totalItems ? Math.ceil(totalItems / itemsPerPage) : 0; + + useEffect(() => { + const newGroup = Math.floor((currentPage - 1) / PAGE_GROUP_SIZE); + setPageGroup(newGroup); + }, [currentPage]); + + if (totalPages < 1) return null; + + const startPage = pageGroup * PAGE_GROUP_SIZE + 1; + const endPage = Math.min(startPage + PAGE_GROUP_SIZE - 1, totalPages); + const pageNumbers = Array.from({ length: endPage - startPage + 1 }, (_, i) => startPage + i); + const isPrevDisabled = pageGroup === 0; + const isNextDisabled = (pageGroup + 1) * PAGE_GROUP_SIZE >= totalPages; + + return ( + <> +
+
+ + {pageNumbers.map(page => ( + + ))} + +
+
+ + ); +}; + +export default Pagination; diff --git a/src/context/appProvider.tsx b/src/context/appProvider.tsx index a699ead..32dff00 100644 --- a/src/context/appProvider.tsx +++ b/src/context/appProvider.tsx @@ -1,6 +1,6 @@ import { ReactNode } from 'react'; import AuthProvider from './authProvider'; -import ToastProvider from './toastContext/toastContext'; +import { ToastProvider } from './toastContext'; const AppProvider = ({ children }: { children: ReactNode }) => { return ( diff --git a/src/context/toastContext/index.ts b/src/context/toastContext/index.ts index e69de29..683120c 100644 --- a/src/context/toastContext/index.ts +++ b/src/context/toastContext/index.ts @@ -0,0 +1 @@ +export { default as ToastProvider } from './toastContext'; diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 5cd8804..2328246 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,5 +1,5 @@ -import { Header, Wrapper } from '@/components/layout'; -import Footer from '@/components/layout/footer/footer'; +import { Footer, Header, Wrapper } from '@/components/layout'; + import AppProvider from '@/context/appProvider'; import '@/styles/fonts.css';