/* eslint-disable react-hooks/exhaustive-deps */
import {
Wrap,
WrapItem,
Spinner,
Center,
useDisclosure,
} from "@chakra-ui/react";
import React, { memo, VFC, useEffect, useCallback } from "react";
import { UserCard } from "../organisms/user/UserCard";
import { useAllUsers } from "../../hooks/useAllUsers";
import { UserDetailModal } from "../organisms/user/UserDetailModal";
import { useSelectUser } from "../../hooks/useSelectUsers";
import { useLoginUser } from "../../hooks/useLoginUser";
export const UserManagement: VFC = memo(() => {
const { isOpen, onOpen, onClose } = useDisclosure();
const { getUsers, users, loading } = useAllUsers();
const { onSelectUser, selectedUser } = useSelectUser();
const { loginUser } = useLoginUser();
console.log(loginUser);
useEffect(() => getUsers(), []);
const onClickUser = useCallback(
(id: number) => {
onSelectUser({ id, users, onOpen });
},
[users]
);
return (
<>
{loading ? (
<Center h="100vh">
<Spinner />
</Center>
) : (
<Wrap p=>
{users.map((user) => (
<WrapItem key={user.id} mx="auto">
<UserCard
id={user.id}
userName={user.username}
fullName={user.name}
imageUrl="https://picsum.photos/800"
onClick={onClickUser}
/>
</WrapItem>
))}
</Wrap>
)}
<UserDetailModal user={selectedUser} isOpen={isOpen} onClose={onClose} />
</>
);
});
import React, { memo, VFC } from "react";
import {
Stack,
Modal,
ModalOverlay,
ModalContent,
ModalHeader,
ModalCloseButton,
ModalBody,
FormControl,
FormLabel,
Input,
} from "@chakra-ui/react";
import { User } from "../../../types/api/user";
type Props = {
user: User | null;
isOpen: boolean;
onClose: () => void;
};
export const UserDetailModal: VFC<Props> = memo((props) => {
const { user, isOpen, onClose } = props;
return (
<Modal
isOpen={isOpen}
onClose={onClose}
autoFocus={false}
motionPreset="slideInBottom"
>
<ModalOverlay />
<ModalContent pb={6}>
<ModalHeader>ユーザー詳細</ModalHeader>
<ModalCloseButton />
<ModalBody mx={4}>
<Stack spacing={4}>
<FormControl>
<FormLabel>名前</FormLabel>
<Input value={user?.username} isReadOnly />
<FormLabel>フルネーム</FormLabel>
<Input value={user?.name} isReadOnly />
<FormLabel>MAIL</FormLabel>
<Input value={user?.email} isReadOnly />
<FormLabel>TEL</FormLabel>
<Input value={user?.phone} isReadOnly />
</FormControl>
</Stack>
</ModalBody>
</ModalContent>
</Modal>
);
});
import { useContext } from "react";
import {
LoginUserContext,
LoginUserContextType,
} from "../providers/LoginUserProvider";
export const useLoginUser = (): LoginUserContextType =>
useContext(LoginUserContext);
import { Route, Switch } from "react-router-dom";
import { Login } from "../component/pages/Login";
import { homeRoutes } from "./HomeRoutes";
import React, { memo, VFC } from "react";
import { Page404 } from "../component/pages/Page404";
import { HeaderLayout } from "../component/templetes/HeaderLayout";
import { LoginUserProvider } from "../providers/LoginUserProvider";
export const Router: VFC = memo(() => {
return (
<Switch>
<LoginUserProvider>
<Route exact path="/">
<Login />
</Route>
<Route
path="/home"
render={({ match: { url } }) => (
<Switch>
{homeRoutes.map((route) => (
<Route
key={route.path}
exact={route.exact}
path={`${url}${route.path}`}
>
<HeaderLayout>{route.children}</HeaderLayout>
</Route>
))}
</Switch>
)}
/>
</LoginUserProvider>
<Route path="*">
<Page404 />
</Route>
</Switch>
);
});
import axios from "axios";
import { useCallback, useState } from "react";
import { User } from "../types/api/user";
import { useHistory } from "react-router-dom";
import { useMessage } from "./useMessage";
import { useLoginUser } from "./useLoginUser";
export const useAuth = () => {
const history = useHistory();
const { showMessage } = useMessage();
const [loading, setLoading] = useState(false);
const { setLoginUser } = useLoginUser();
const login = useCallback(
(id: string) => {
setLoading(true);
axios
.get<User>(`https://jsonplaceholder.typicode.com/users/${id}`)
.then((res) => {
if (res.data) {
setLoginUser(res.data);
showMessage({ title: "ログインしました", status: "success" });
history.push("/home");
} else {
showMessage({
title: "ユーザーが見つかりませんでした",
status: "error",
});
setLoading(false);
}
})
.catch(() => {
showMessage({
title: "ログイン出来ませんでした",
status: "error",
});
setLoading(false);
});
},
[history, showMessage, setLoginUser]
);
return { login, loading };
};