Advertisement
magrega

Untitled

Apr 30th, 2023 (edited)
700
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { FC, useCallback, useEffect, useState } from 'react';
  2. import 'swiper/css';
  3. import { Swiper, SwiperSlide } from 'swiper/react';
  4. import { TPost, getPosts } from '../../services/getPosts';
  5. import AddStoryModal from '../AddStoryModal/AddStoryModal';
  6. import PostItem from '../PostItem/PostItem';
  7. import Spinner from '../Spinner/Spinner';
  8. import './PostList.css';
  9. import ErrorSign from '../ErrorSign/ErrorSign';
  10.  
  11. export type TPostData = {
  12.     posts: [{
  13.         body: string;
  14.         id: number;
  15.         title: string;
  16.         userId: number;
  17.     }]
  18. }
  19.  
  20. const PostList: FC = () => {
  21.  
  22.     const [postsData, setPostsData] = useState<TPost[] | undefined>();
  23.     const [page, setPage] = useState(0);
  24.     const [loading, setLoading] = useState(true);
  25.     const [loadingMorePosts, setLoadingMorePosts] = useState(false);
  26.     const [error, setError] = useState(false);
  27.  
  28.     const getPostsFromServer = useCallback(() => {
  29.         getPosts(page)
  30.             .then(newPosts => newPosts.json() as Promise<TPostData>)
  31.             .then(newPosts => {
  32.                 setPostsData(prevState => [...(prevState ?? []), ...newPosts.posts]);
  33.                 setLoading(false);
  34.                
  35.             })
  36.             .catch(e => {
  37.                 setError(true);
  38.                 console.log(e.message);
  39.                 setLoading(false);
  40.             })
  41.     }, [page]);
  42.  
  43.     const showMore = () => {
  44.         setLoadingMorePosts(true);
  45.         setPage(prevPage => prevPage + 1);
  46.     }
  47.  
  48.     useEffect(() => { getPostsFromServer() }, [getPostsFromServer, page]);
  49.  
  50.     if (loading) {
  51.         return <Spinner />;
  52.     }
  53.  
  54.     return (
  55.         <div className="post-list">
  56.             <div className="post-list__menu">
  57.                 <div className="post-list__menu-left">
  58.                     <span>user stories</span>
  59.                     <span className='disabled'>last change<span className='sticker'>soon</span></span>
  60.                 </div>
  61.                 <AddStoryModal />
  62.             </div>
  63.             <div className='post-list__postitem-view'>
  64.                 <Swiper
  65.                     spaceBetween={10}
  66.                     slidesPerView={"auto"}
  67.                     grabCursor={true}
  68.                     touchMoveStopPropagation={true}
  69.                     onReachEnd={showMore}
  70.                 >
  71.                     {error ? <ErrorSign /> : postsData?.map((post: TPost) => {
  72.                         return <SwiperSlide key={post.id}>
  73.                             <PostItem key={post.id} title={post.title} body={post.body} userId={post.userId} id={post.id} />
  74.                         </SwiperSlide>
  75.                     })}
  76.                     {loadingMorePosts ? <SwiperSlide className='post-item-spinner' key={"spinner"}><Spinner /></SwiperSlide> : null}
  77.                 </Swiper>
  78.             </div>
  79.         </div>
  80.     );
  81. };
  82.  
  83. export default PostList;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement