- #18: voluptate et itaque vero tempora molestiae
+ #{postSelected.id}: {postSelected.title}
-
- eveniet quo quis laborum totam consequatur non dolor ut et est
- repudiandae est voluptatem vel debitis et magnam
-
+
{postSelected.body}
-
-
-
- Something went wrong
-
-
-
- No comments yet
-
+ {isLoading &&
}
-
Comments:
-
-
-
-
-
- Some comment
-
-
-
-
-
-
- One more comment
+ {isError && !isLoading && (
+
+ Something went wrong
-
+ )}
-
-
-
- Misha Hrynko
-
+ {!comments.length && !isError && !isLoading && (
+
+ No comments yet
+
+ )}
-
-
-
-
- {'Multi\nline\ncomment'}
-
-
+ {!!comments.length && !isLoading && !isError && (
+ <>
+
Comments:
+ {comments.map(comment => (
+
+ ))}
+ >
+ )}
-
+ {!isLoading && !isError && !isAddingComment && (
+
+ )}
-
+ {isAddingComment && (
+
+ )}
);
diff --git a/src/components/PostsList.tsx b/src/components/PostsList.tsx
index cf90f04b0..099f620f0 100644
--- a/src/components/PostsList.tsx
+++ b/src/components/PostsList.tsx
@@ -1,86 +1,43 @@
-import React from 'react';
-
-export const PostsList: React.FC = () => (
-
-
Posts:
-
-
-
-
- # |
- Title |
- {/* eslint-disable-next-line jsx-a11y/control-has-associated-label */}
- |
-
-
-
-
-
- 17 |
-
-
- fugit voluptas sed molestias voluptatem provident
- |
-
-
-
- |
-
-
-
- 18 |
-
-
- voluptate et itaque vero tempora molestiae
- |
-
-
-
- |
-
-
-
- 19 |
- adipisci placeat illum aut reiciendis qui |
-
-
-
- |
-
-
-
- 20 |
- doloribus ad provident suscipit at |
-
-
-
- |
-
-
-
-
-);
+import React, { useEffect, useState } from 'react';
+import { Post as PostUser } from '../types/Post';
+import { Post } from './Post';
+
+type Props = {
+ postsByUser: PostUser[];
+ setPostSelected: (post: PostUser | null) => void;
+};
+export const PostsList: React.FC
= props => {
+ const { postsByUser, setPostSelected } = props;
+ const [currentPost, setCurrentPost] = useState(null);
+
+ useEffect(() => {
+ setPostSelected(currentPost);
+ }, [currentPost, setPostSelected]);
+
+ return (
+
+
Posts:
+
+
+
+
+ # |
+ Title |
+ |
+
+
+
+
+ {postsByUser.map(post => (
+
+ ))}
+
+
+
+ );
+};
diff --git a/src/components/UserSelector.tsx b/src/components/UserSelector.tsx
index c89442841..19a8533db 100644
--- a/src/components/UserSelector.tsx
+++ b/src/components/UserSelector.tsx
@@ -1,16 +1,64 @@
-import React from 'react';
+import React, { Dispatch, SetStateAction, useEffect, useState } from 'react';
+import * as usersService from '../api/users';
+
+import { User } from '../types/User';
+import cn from 'classnames';
+import { Post } from '../types/Post';
+
+type Props = {
+ setIsError: (error: boolean) => void;
+ setUserSelectedId: (userId: number) => void;
+ isActive: boolean;
+ setIsActive: (isActive: boolean) => void;
+ setPostsByUser: Dispatch>;
+};
+export const UserSelector: React.FC = props => {
+ const {
+ setIsError,
+ setUserSelectedId,
+ isActive,
+ setIsActive,
+ setPostsByUser,
+ } = props;
+
+ const [users, setUsers] = useState([]);
+ const [activeUser, setActiveUser] = useState(null);
+
+ useEffect(() => {
+ usersService
+ .getUsers()
+ .then(setUsers)
+ .catch(() => setIsError(true));
+ }, [setIsError]);
+
+ useEffect(() => {
+ setIsActive(false);
+ }, [setIsActive]);
+
+ const handleClickOnUser = (user: User) => {
+ setPostsByUser([]);
+ setActiveUser(user);
+ setUserSelectedId(user.id);
+ setIsActive(false);
+ };
-export const UserSelector: React.FC = () => {
return (
-
+
diff --git a/src/utils/fetchClient.ts b/src/utils/fetchClient.ts
index feb6915ce..56e57af13 100644
--- a/src/utils/fetchClient.ts
+++ b/src/utils/fetchClient.ts
@@ -29,7 +29,10 @@ function request
(
// for a demo purpose we emulate a delay to see if Loaders work
return wait(300)
.then(() => fetch(BASE_URL + url, options))
- .then(response => response.json());
+ .then(response => response.json())
+ .catch(() => {
+ throw new Error();
+ });
}
export const client = {