sdy

remove room

1 -import React, { useState } from "react";
2 -import { useMutation } from "@apollo/react-hooks";
3 -import { withRouter } from "react-router-dom";
4 -import RoomPresenter from "./RoomPresenter";
5 -import { CREATE_ROOM } from "./RoomQueries";
6 -import useInput from "../../Hooks/useInput";
7 -import { toast } from "react-toastify";
8 -
9 -export default withRouter(() => {
10 - const [action, setAction] = useState("showList");
11 -
12 - const roomName = useInput("");
13 -
14 - const [createRoom] = useMutation(CREATE_ROOM);
15 -
16 - let newRoomObj;
17 -
18 - const onSubmit = async (e) => {
19 - e.preventDefault();
20 - if (roomName.value !== "") {
21 - try {
22 - newRoomObj = await createRoom({ variables: { name: roomName.value } });
23 - if (!newRoomObj) {
24 - // when fail to create room
25 - toast.error("fail to create new room");
26 - } else {
27 - // when success to make room
28 - toast.success("success to make new room !");
29 - setAction("showList");
30 - }
31 - } catch {
32 - toast.error("occur unexpected error");
33 - }
34 - } else {
35 - toast.error("room name is required !");
36 - }
37 - };
38 -
39 - return (
40 - <RoomPresenter
41 - action={action}
42 - setAction={setAction}
43 - onSubmit={onSubmit}
44 - roomName={roomName}
45 - />
46 - );
47 -});
1 -import React from "react";
2 -import styled from "styled-components";
3 -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
4 -import { faArrowRight } from "@fortawesome/free-solid-svg-icons";
5 -import { Link } from "react-router-dom";
6 -import Input from "../../Components/Input";
7 -import Button from "../../Components/Button";
8 -import { useQuery } from "@apollo/react-hooks";
9 -import { GET_ROOMS } from "./RoomQueries";
10 -
11 -const Wrapper = styled.div`
12 - display: flex;
13 - flex-direction: column;
14 - width: 100%;
15 - justify-content: center;
16 - align-items: center;
17 - .Header {
18 - position: fixed;
19 - top: 0;
20 - }
21 -`;
22 -
23 -const HideWrapper = styled.div`
24 - display: flex;
25 - flex-direction: column;
26 - width: 100%;
27 - height: 100%;
28 - justify-content: center;
29 - align-items: center;
30 - background-color: #535c68;
31 - opacity: 0.6;
32 -`;
33 -
34 -const FormContainer = styled.div`
35 - display: flex;
36 - position: fixed;
37 - background-color: #f5f6fa;
38 - min-height: 10rem;
39 - min-width: 20rem;
40 - border-radius: 10px;
41 -`;
42 -
43 -const Form = styled.form`
44 - display: flex;
45 - flex-direction: column;
46 - align-items: center;
47 - justify-content: center;
48 - width: 100%;
49 - padding: 15px;
50 - span {
51 - margin-bottom: 15px;
52 - }
53 - input {
54 - margin-bottom: 15px;
55 - }
56 - button {
57 - background-color: #1e3799;
58 - width: 30%;
59 - color: white;
60 - border-radius: 10px;
61 - font-family: "Ubuntu", sans-serif;
62 - }
63 -`;
64 -
65 -const FormText = styled.span`
66 - font-size: 15px;
67 - font-family: "Ubuntu", sans-serif;
68 -`;
69 -
70 -const RoomWrapper = styled.div`
71 - display: flex;
72 - flex-direction: column;
73 - justify-content: center;
74 - align-items: center;
75 - background-color: #a5b1c2;
76 - border-radius: 10px;
77 - box-shadow: 1px 1px 10px #8395a7;
78 - min-width: 23.75rem;
79 - width: auto;
80 - max-height: none;
81 - padding: 0.5rem 0.7rem 0 1rem;
82 -`;
83 -
84 -const RoomContainer = styled.div`
85 - display: flex;
86 - flex-direction: column;
87 - width: 100%;
88 - overflow-y: scroll;
89 - max-height: 85px;
90 - justify-content: center;
91 - align-items: center;
92 - &::-webkit-scrollbar {
93 - width: 10px;
94 - }
95 - &::-webkit-scrollbar-track {
96 - background-color: transparent;
97 - }
98 - &::-webkit-scrollbar-thumb {
99 - border-radius: 3px;
100 - background-color: gray;
101 - }
102 - &::-webkit-scrollbar-button {
103 - width: 0;
104 - height: 0;
105 - }
106 -`;
107 -
108 -const RoomUL = styled.ul`
109 - width: 100%;
110 - display: flex;
111 - flex-direction: column;
112 - justify-content: space-between;
113 - svg {
114 - color: white;
115 - opacity: 0.7;
116 - }
117 -`;
118 -
119 -const RoomItem = styled.li`
120 - font-family: "Ubuntu", sans-serif;
121 -`;
122 -
123 -const CreateContainer = styled.div`
124 - padding-top: 1.9rem;
125 - padding-bottom: 1.7rem;
126 - box-shadow: 0 -4px 4px rgba(0, 0, 0, 0.04);
127 -`;
128 -
129 -const StyledLink = styled(Link)`
130 - width: 100%;
131 - display: flex;
132 - flex-direction: row;
133 - justify-content: space-between;
134 - align-items: center;
135 - text-decoration: none;
136 - cursor: pointer;
137 - color: #079992;
138 - &:not(:last-child) {
139 - margin-bottom: 10px;
140 - }
141 - svg {
142 - color: #079992;
143 - &:hover {
144 - border-bottom: 1px solid #079992;
145 - }
146 - }
147 - li {
148 - color: black;
149 - &:hover {
150 - color: #079992;
151 - }
152 - }
153 - span {
154 - &:hover {
155 - border-bottom: 1px solid #079992;
156 - }
157 - }
158 -`;
159 -
160 -export default ({ action, setAction, onSubmit, roomName }) => {
161 - const { data } = useQuery(GET_ROOMS);
162 -
163 - let roomArray;
164 - if (data !== undefined) {
165 - const { getRooms } = data;
166 - roomArray = getRooms;
167 - }
168 -
169 - return (
170 - <Wrapper>
171 - {action === "showList" ? (
172 - <>
173 - <RoomWrapper>
174 - <RoomContainer>
175 - <RoomUL>
176 - {roomArray &&
177 - roomArray.map((e) => (
178 - <StyledLink to={e.name} key={e.id}>
179 - <RoomItem>{e.name}</RoomItem>
180 - <FontAwesomeIcon icon={faArrowRight} />
181 - </StyledLink>
182 - ))}
183 - </RoomUL>
184 - </RoomContainer>
185 - <CreateContainer>
186 - <StyledLink to="/" onClick={() => setAction("makeList")}>
187 - <span>Create New Room</span>
188 - </StyledLink>
189 - </CreateContainer>
190 - </RoomWrapper>
191 - </>
192 - ) : (
193 - <HideWrapper className="hideWrapper">
194 - <FormContainer>
195 - <Form onSubmit={onSubmit}>
196 - <FormText>Room Name</FormText>
197 - <Input placeholder="Enter new Room name" {...roomName} />
198 - <Button text="Submit" />
199 - </Form>
200 - </FormContainer>
201 - </HideWrapper>
202 - )}
203 - </Wrapper>
204 - );
205 -};
1 -import gql from "graphql-tag";
2 -
3 -export const GET_ROOMS = gql`
4 - {
5 - getRooms {
6 - id
7 - name
8 - }
9 - }
10 -`;
11 -
12 -export const CREATE_ROOM = gql`
13 - mutation createRoom($name: String!) {
14 - createRoom(name: $name) {
15 - id
16 - name
17 - }
18 - }
19 -`;