diff --git a/src/App.tsx b/src/App.tsx index 8d41f0acb..3bc5a1b75 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,39 +5,19 @@ import './App.scss'; import { PostsList } from './components/PostsList'; //import { PostDetails } from './components/PostDetails'; import { UserSelector } from './components/UserSelector'; -import { Loader } from './components/Loader'; import { useEffect, useState } from 'react'; import { User } from './types/User'; -import { getPosts, getUsers } from './api/posts'; -import { Post } from './types/Post'; +import { getUsers } from './api/posts'; export const App = () => { const [usersList, setUsersList] = useState([]); - const [postsList, setPostsList] = useState([]); const [user, setUser] = useState(); - const [isLoading, setIsLoading] = useState(false); - const [isError, setIsError] = useState(false); - //const [isHadPost, setIsHadPost] = useState(false) - - const filteredPostsList = () => { - return postsList.filter(post => post.userId === user?.id); - }; + const selectedUserId = user?.id; useEffect(() => { getUsers().then(setUsersList); }, []); - const getPostList = (id: number) => { - setIsLoading(true); - - getPosts(id) - .then(posts => setPostsList(posts)) - .catch(() => setIsError(true)) - .finally(() => { - setIsLoading(false); - }); - }; - return (
@@ -45,39 +25,18 @@ export const App = () => {
- +
- {filteredPostsList().length && !isError && !isLoading ? ( - - ) : ( + {!selectedUserId ? (

No user selected

+ ) : ( + )} - - {isLoading && } - - {isError && ( -
- Something went wrong! -
- )} - - {!filteredPostsList().length && user && !isError && ( -
- No posts yet -
- )} - - {/* */}
+ + {/* */}
diff --git a/src/api/posts.ts b/src/api/posts.ts index a286e189a..6af4aa7b7 100644 --- a/src/api/posts.ts +++ b/src/api/posts.ts @@ -2,10 +2,14 @@ import { client } from '../../src/utils/fetchClient'; import { Post } from '../types/Post'; import { User } from '../types/User'; -export const getUsers = () => { - return client.get('/users'); +export const getUsers = async () => { + const users = await client.get('/users'); + + return users; }; -export const getPosts = (id: number | undefined) => { - return client.get(`/posts?userId=${id}`); +export const getPosts = async (id: number | undefined) => { + const posts = await client.get(`/posts?userId=${id}`); + + return posts; }; diff --git a/src/components/PostsList.tsx b/src/components/PostsList.tsx index 0a0adb225..7188e9a2d 100644 --- a/src/components/PostsList.tsx +++ b/src/components/PostsList.tsx @@ -1,94 +1,95 @@ -import React from 'react'; +import { useEffect, useState } from 'react'; import { Post } from '../types/Post'; +import { getPosts } from '../api/posts'; +import { Loader } from './Loader'; interface Props { - filteredPostsList: Post[]; + selectedUserId: number | undefined; } -export const PostsList: React.FC = ({ filteredPostsList }) => { - return ( -
-

Posts:

+export const PostsList: React.FC = ({ selectedUserId }) => { + const [postsList, setPostsList] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [isError, setIsError] = useState(false); + + const filteredPostsList = () => { + return postsList.filter(post => post.userId === selectedUserId); + }; - - - - - - {/* eslint-disable-next-line jsx-a11y/control-has-associated-label */} - - - + const isHasPostsList = filteredPostsList().length; - - {filteredPostsList.map(post => ( - - + useEffect(() => { + if (selectedUserId !== undefined) { + const fetchPosts = async () => { + setIsLoading(true); + try { + const posts = await getPosts(selectedUserId); - + setPostsList(posts); + } catch (error) { + setIsError(true); + } finally { + setIsLoading(false); + } + }; - - - ))} + fetchPosts(); + } + }, [selectedUserId]); - {/* - + return ( + <> + {!isLoading && isHasPostsList > 0 && ( +
+

Posts:

-
+
#Title
{post.id}{post.title} - -
18 - voluptate et itaque vero tempora molestiae -
+ + + + + {/* eslint-disable-next-line jsx-a11y/control-has-associated-label */} + + + - - */} + + {filteredPostsList().map(post => ( + + - {/* - - + - - + + + ))} + +
#Title
- -
{post.id}
19 - adipisci placeat illum aut reiciendis qui - {post.title} - -
+ +
+
+ )} + {isLoading && } - - 20 - doloribus ad provident suscipit at + {isError && ( +
+ Something went wrong! +
+ )} - - - - */} - - -
+ {!isHasPostsList && selectedUserId && !isError && !isLoading && ( +
+ No posts yet +
+ )} + ); }; diff --git a/src/components/UserSelector.tsx b/src/components/UserSelector.tsx index 145dadbf8..c56561de1 100644 --- a/src/components/UserSelector.tsx +++ b/src/components/UserSelector.tsx @@ -5,20 +5,11 @@ import { User } from '../types/User'; interface Props { usersList: User[]; setUser: (user: User) => void; - getPostList: (id: number) => void; } -export const UserSelector: React.FC = ({ - usersList, - setUser, - getPostList, -}) => { +export const UserSelector: React.FC = ({ usersList, setUser }) => { const [dropdownIsActive, setDropdowmIsActive] = useState(false); - // const getUserById = async (id: string) => { - // return getUser(id).then(setUser); - // }; - return (
= ({ className="dropdown-item" onMouseDown={() => { setUser(user); - getPostList(user.id); }} > {user.name}