hhm-client/src/components/global/NewsScroll.tsx

145 lines
4.3 KiB
TypeScript
Raw Normal View History

2023-02-09 20:22:36 +00:00
// Modules
2023-03-07 20:18:27 +00:00
import { useEffect, useState } from "react";
import { v4 as uuidv4 } from "uuid";
import { useSelector, useDispatch } from "react-redux";
2023-02-09 20:22:36 +00:00
2023-01-30 14:17:29 +00:00
// Components
2023-03-07 20:18:27 +00:00
import News from "../news/News";
import SectionTitle from "./SectionTitle";
import Loader from "./Loader";
import Pagination from "./Pagination";
2023-02-09 20:22:36 +00:00
// Api
2023-03-07 20:18:27 +00:00
import { url } from "../../url";
import { Api } from "../../api/Api";
import { newsScrollParams } from "../../api/params";
2023-02-09 20:22:36 +00:00
// Types
2023-03-07 20:18:27 +00:00
import { IPostsData } from "../../types/data.types";
import { RootState } from "../../types/store.types";
2023-02-09 20:22:36 +00:00
// Actions
2023-03-07 20:18:27 +00:00
import { setNewsScroll } from "../../actions/setData";
import { INewPostsData } from "../../types/posts.types";
2023-01-30 14:17:29 +00:00
2023-02-01 08:40:26 +00:00
interface Props {
2023-02-09 20:22:36 +00:00
title: boolean;
2023-02-17 18:41:03 +00:00
category?: number;
2023-03-01 19:52:59 +00:00
count?: number;
avoidFirst?: boolean;
2023-02-01 08:40:26 +00:00
}
2023-03-01 19:52:59 +00:00
const NewsScroll = ({ title, category, count, avoidFirst }: Props) => {
2023-02-14 12:09:10 +00:00
const params = newsScrollParams.slice();
2023-03-07 20:18:27 +00:00
category ? params.push({ name: "category", value: category }) : null;
2023-03-01 19:52:59 +00:00
count ? (params[0].value = count) : null;
2023-02-14 12:09:10 +00:00
2023-03-07 20:18:27 +00:00
const api = new Api(url + "/pagination/new/posts", params);
2023-02-09 20:22:36 +00:00
const language = api.language;
const [lastLanguage, setLastLanguage] = useState<string>(language);
// redux
2023-03-07 20:18:27 +00:00
const rawData = useSelector<RootState, RootState["newsScroll"]["data"]>(
(state) => state.newsScroll.data
2023-02-09 20:22:36 +00:00
);
const dispatch = useDispatch();
useEffect(() => {
2023-03-06 19:53:43 +00:00
api.get(rawData, (data: INewPostsData) => dispatch(setNewsScroll(data)));
2023-02-14 12:09:10 +00:00
setLastLanguage(language);
}, [category]);
useEffect(() => {
2023-03-07 20:18:27 +00:00
if (rawData.data[0].id > 0) {
2023-03-06 19:53:43 +00:00
if (!(lastLanguage === language)) {
api.get(rawData, (rawData) => dispatch(setNewsScroll(rawData)));
2023-02-14 12:09:10 +00:00
setLastLanguage(language);
}
2023-02-09 20:22:36 +00:00
}
}, [language, lastLanguage]);
2023-03-07 20:18:27 +00:00
const [filteredData, setFilteredData] = useState<INewPostsData["data"]>(
rawData.data
2023-03-07 10:22:59 +00:00
);
2023-02-17 14:13:27 +00:00
useEffect(() => {
2023-03-07 20:18:27 +00:00
const filtered = rawData.data.filter((el, index) => {
2023-02-28 10:28:51 +00:00
if (index >= 0) {
2023-02-17 14:13:27 +00:00
return el;
}
});
setFilteredData(filtered);
}, [rawData]);
2023-01-30 14:17:29 +00:00
return (
<div className="news-scroll">
<div className="news-scroll-wrapper">
2023-02-09 20:22:36 +00:00
{title === true ? (
2023-02-14 12:09:10 +00:00
<SectionTitle
2023-03-07 10:22:59 +00:00
title={
2023-03-07 20:18:27 +00:00
language === "EN"
? "Newsline"
: language === "RU"
? "Лента новостей"
: "Habarlar"
2023-03-07 10:22:59 +00:00
}
linkData={{
2023-03-07 20:18:27 +00:00
link: "/all",
2023-03-07 10:22:59 +00:00
title: `${
2023-03-07 20:18:27 +00:00
language === "EN"
? "View all"
: language === "RU"
? "Посмотреть все"
: "Doly gör"
2023-03-07 10:22:59 +00:00
}`,
}}
2023-02-14 12:09:10 +00:00
/>
2023-02-01 08:40:26 +00:00
) : null}
2023-01-30 14:17:29 +00:00
<div className="news-scroll-inner">
2023-02-17 14:13:27 +00:00
{filteredData.length > 0 ? (
2023-03-07 20:18:27 +00:00
(filteredData as INewPostsData["data"])[0].id > -1 ? (
(filteredData as INewPostsData["data"]).map((dataEl, index) => {
2023-03-07 10:22:59 +00:00
if (avoidFirst) {
if (index > 0) {
2023-03-01 19:52:59 +00:00
return (
<News
key={uuidv4()}
2023-03-06 19:53:43 +00:00
id={dataEl?.id}
title={dataEl?.title}
text={dataEl?.excerpt}
date={dataEl?.published_at}
categories={dataEl?.categories}
img={dataEl?.featured_images[0]?.path}
2023-03-07 20:18:27 +00:00
video={{ type: dataEl?.type, url: dataEl?.video }}
2023-03-01 19:52:59 +00:00
/>
);
}
2023-03-07 10:22:59 +00:00
} else {
return (
<News
key={uuidv4()}
id={dataEl?.id}
title={dataEl?.title}
text={dataEl?.excerpt}
date={dataEl?.published_at}
categories={dataEl?.categories}
img={dataEl?.featured_images[0]?.path}
2023-03-07 20:18:27 +00:00
video={{ type: dataEl?.type, url: dataEl?.video }}
2023-03-07 10:22:59 +00:00
/>
);
2023-03-01 19:52:59 +00:00
}
2023-03-07 10:22:59 +00:00
})
2023-02-14 12:09:10 +00:00
) : (
<Loader />
)
2023-02-09 20:22:36 +00:00
) : (
2023-02-14 12:09:10 +00:00
<p className="scroll-empty">Нет новостей в этой категории</p>
2023-02-09 20:22:36 +00:00
)}
2023-01-30 14:17:29 +00:00
</div>
</div>
</div>
);
};
export default NewsScroll;