error boundary and table pagination

This commit is contained in:
Mikola 2024-03-19 16:39:00 +03:00
parent 923a84e488
commit 6afccb19d8
6 changed files with 89 additions and 4 deletions

View File

@ -1,4 +1,5 @@
import React, { Component } from "react"; import React, { Component } from "react";
import { Fallback } from "./Fallback";
class ErrorBoundary extends Component { class ErrorBoundary extends Component {
state = { state = {
@ -13,7 +14,7 @@ class ErrorBoundary extends Component {
const { error } = this.state; const { error } = this.state;
if (error) { if (error) {
return <div>Что-то пошло не так =( {error}</div>; return <Fallback />;
} }
return this.props.children; return this.props.children;
} }

20
src/hoc/Fallback.jsx Normal file
View File

@ -0,0 +1,20 @@
import React from "react";
import logo from "assets/images/logo/ITguild.svg";
import rightArrow from "assets/icons/arrows/arrowRight.svg";
import './fallback.scss'
export const Fallback = () => {
return (
<div className="fallback">
<img src={logo} alt="logo" className="logo" />
<h1>Произошла непредвиденная ошибка</h1>
<a href='/profile'>
Вернуться назад
<img src={rightArrow} alt="arrow" />
</a>
</div>
);
};

19
src/hoc/fallback.scss Normal file
View File

@ -0,0 +1,19 @@
.fallback {
display: flex;
flex-direction: column;
align-items: center;
padding: 100px;
gap: 15px;
img {
max-width: 250px;
}
a {
display: flex;
column-gap: 10px;
align-items: center;
font-size: 16px;
color: black;
}
}

View File

@ -1,13 +1,16 @@
import React from "react"; import React from "react";
import ReactDOM from "react-dom/client"; import ReactDOM from "react-dom/client";
import { Provider } from "react-redux"; import { Provider } from "react-redux";
import ErrorBoundary from "./hoc/ErrorBoundary";
import App from "./App"; import App from "./App";
import "./index.css"; import "./index.css";
import { store } from "./store/store"; import { store } from "./store/store";
ReactDOM.createRoot(document.getElementById("root")).render( ReactDOM.createRoot(document.getElementById("root")).render(
<ErrorBoundary>
<Provider store={store}> <Provider store={store}>
<App /> <App />
</Provider> </Provider>
</ErrorBoundary>
); );

View File

@ -14,6 +14,7 @@ import { Loader } from "@components/Common/Loader/Loader";
import { Navigation } from "@components/Navigation/Navigation"; import { Navigation } from "@components/Navigation/Navigation";
import { ProfileBreadcrumbs } from "@components/ProfileBreadcrumbs/ProfileBreadcrumbs"; import { ProfileBreadcrumbs } from "@components/ProfileBreadcrumbs/ProfileBreadcrumbs";
import { ProfileHeader } from "@components/ProfileHeader/ProfileHeader"; import { ProfileHeader } from "@components/ProfileHeader/ProfileHeader";
import { usePagination } from "@table-library/react-table-library/pagination";
import rightArrow from "assets/icons/arrows/arrowRight.svg"; import rightArrow from "assets/icons/arrows/arrowRight.svg";
@ -101,6 +102,13 @@ export const PartnerCategories = () => {
} }
); );
const pagination = usePagination(data, {
state: {
page: 0,
size: 5,
}
});
useEffect(() => { useEffect(() => {
setLoader(true); setLoader(true);
apiRequest("/project/my-employee").then((el) => { apiRequest("/project/my-employee").then((el) => {
@ -259,7 +267,27 @@ export const PartnerCategories = () => {
data={data} data={data}
theme={theme} theme={theme}
sort={sort} sort={sort}
pagination={pagination}
/> />
<div className="table__pagination">
<span>Total Pages: {pagination.state.getTotalPages(data.nodes)}</span>
<span className="table__pages">
Page:{" "}
{pagination.state.getPages(data.nodes).map((_, index) => (
<button
key={index}
type="button"
style={{
fontWeight: pagination.state.page === index ? "bold" : "normal",
}}
onClick={() => pagination.fns.onSetPage(index)}
>
{index + 1}
</button>
))}
</span>
</div>
</> </>
) : ( ) : (
<div className="partner-categories__empty"> <div className="partner-categories__empty">

View File

@ -176,5 +176,19 @@
font-size: 16px; font-size: 16px;
align-items: center; align-items: center;
} }
&__pagination {
width: 100%;
display: flex;
justify-content: space-between;
font-size: 16px;
align-items: center;
}
&__pages {
display: flex;
column-gap: 5px;
align-items: center;
}
} }
} }