Spaces:
Runtime error
Runtime error
import './ContentSection.scss'; | |
import { useContext, useEffect, useState } from 'react'; | |
import { Pagination } from '@/components/shared/Pagination/Pagination'; | |
import { isEmbedded } from '@/shared/iframe-detector'; | |
import { sendScrollMessage } from '@/shared/iframe-message-emitter'; | |
import { INotebookMetadata } from '@/shared/notebook-metadata'; | |
import { notebooksService } from '@/shared/notebooks.service'; | |
import { NotebooksContext } from '@/shared/notebooks-context'; | |
import { ContentSectionHeader } from './ContentSectionHeader/ContentSectionHeader'; | |
import { NotebooksList } from './NotebooksList/NotebooksList'; | |
const notebooksPerPageOptions = [5, 10, 25, 50]; | |
const scrollToTop = () => { | |
if (isEmbedded) { | |
sendScrollMessage(); | |
} else { | |
window.scrollTo({ top: 0, behavior: 'smooth' }); | |
} | |
}; | |
export const ContentSection = (): JSX.Element => { | |
const { selectedTags, searchValue, sort, page, setPage } = useContext(NotebooksContext); | |
const [notebooks, setNotebooks] = useState<INotebookMetadata[]>([]); | |
const [filteredNotebooksCount, setFilteredNotebooksCount] = useState<number>(0); | |
const [totalNotebooksCount, setTotalNotebooksCount] = useState<number>(0); | |
const [itemsPerPage, setItemsPerPage] = useState<number>(notebooksPerPageOptions[0]); | |
const totalPages = Math.ceil(filteredNotebooksCount / itemsPerPage); | |
useEffect(() => { | |
setPage(1); | |
}, [selectedTags, searchValue, sort, setPage]); | |
useEffect(() => { | |
void notebooksService | |
.getNotebooks({ | |
tags: selectedTags, | |
searchValue, | |
sort, | |
offset: (page - 1) * itemsPerPage, | |
limit: itemsPerPage, | |
}) | |
.then(([paginatedNotebooks, totalSearchedNotebooks, totalNotebooksCount]) => { | |
setNotebooks(paginatedNotebooks); | |
setFilteredNotebooksCount(totalSearchedNotebooks); | |
setTotalNotebooksCount(totalNotebooksCount); | |
scrollToTop(); | |
}); | |
}, [selectedTags, searchValue, sort, page, itemsPerPage]); | |
return ( | |
<section className="flex-col flex-1 content-section"> | |
<ContentSectionHeader | |
totalCount={totalNotebooksCount} | |
filteredCount={filteredNotebooksCount} | |
></ContentSectionHeader> | |
<NotebooksList items={notebooks}></NotebooksList> | |
{Boolean(notebooks.length) && ( | |
<Pagination | |
itemsPerPageOptions={notebooksPerPageOptions} | |
itemsPerPage={itemsPerPage} | |
page={page} | |
totalPages={totalPages} | |
onChangePage={setPage} | |
onChangeItemsPerPage={setItemsPerPage} | |
></Pagination> | |
)} | |
</section> | |
); | |
}; | |