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;
|