Skip to content

Commit c0b829d

Browse files
Merge pull request #72 from ut-code/feature/DropDown
ログイン機能を作成
2 parents d96737d + 514a713 commit c0b829d

5 files changed

Lines changed: 99 additions & 9 deletions

File tree

packages/web/src/App.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useRef, useState } from "react";
1+
import { useEffect, useRef, useState } from "react";
22
import Blockly from "blockly";
33
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
44
// @ts-ignore
@@ -10,6 +10,8 @@ import TestPlay from "./component/TestPlay";
1010
import Arena from "./component/Arena";
1111
import Welcome from "./component/Welcome";
1212
import ButtonAppBar from "./component/ButtonAppBar";
13+
import { getUsers } from "./fetchAPI";
14+
import type { User } from "./component/Emulator";
1315

1416
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
1517
// @ts-ignore
@@ -28,8 +30,16 @@ export default function App() {
2830
program: "",
2931
rank: 0,
3032
});
33+
const [users, setUsers] = useState<User[]>([]);
3134
const workspaceRef = useRef<Blockly.WorkspaceSvg>();
3235

36+
useEffect(() => {
37+
async function fetchUsers() {
38+
setUsers(await getUsers());
39+
}
40+
fetchUsers();
41+
}, []);
42+
3343
return (
3444
<>
3545
<Box
@@ -43,11 +53,12 @@ export default function App() {
4353
<ButtonAppBar />
4454
<Injection workspaceRef={workspaceRef} />
4555
</Box>
46-
<Welcome setCurrentUser={setCurrentUser} />
56+
<Welcome users={users} setCurrentUser={setCurrentUser} />
4757
<Arena
4858
currentUser={currentUser}
4959
setCurrentUser={setCurrentUser}
5060
workspaceRef={workspaceRef}
61+
users={users}
5162
/>
5263
<TestPlay
5364
currentUser={currentUser}

packages/web/src/component/Arena.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
1919
import { grey } from "@mui/material/colors";
2020
import { FaFortAwesome } from "react-icons/fa";
2121
import type { User } from "./game";
22-
import { getUsers, getUser, changeUserName, uploadProgram } from "../fetchAPI";
22+
import { getUser, changeUserName, uploadProgram } from "../fetchAPI";
2323

2424
interface ChangeNameDialogProps {
2525
currentUser: User;
@@ -109,10 +109,11 @@ interface ArenaProps {
109109
currentUser: User;
110110
setCurrentUser: (value: User) => void;
111111
workspaceRef: React.MutableRefObject<Blockly.WorkspaceSvg | undefined>;
112+
users: User[];
112113
}
113114

114115
export default function Arena(props: ArenaProps) {
115-
const { currentUser, setCurrentUser, workspaceRef } = props;
116+
const { currentUser, setCurrentUser, workspaceRef, users } = props;
116117
const [numberOfUsers, setNumberOfUsers] = useState(0);
117118
const [loaded, setLoaded] = useState(false);
118119
const [open, setOpen] = useState(false);
@@ -122,7 +123,7 @@ export default function Arena(props: ArenaProps) {
122123
const handleChange = async (_: unknown, expanded: boolean) => {
123124
if (expanded) {
124125
setCurrentUser(await getUser(currentUser.id));
125-
setNumberOfUsers((await getUsers()).length);
126+
setNumberOfUsers(users.length);
126127
setLoaded(true);
127128
} else setLoaded(false);
128129
};
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import * as React from "react";
2+
import Button from "@mui/material/Button";
3+
import Box from "@mui/material/Box";
4+
import InputLabel from "@mui/material/InputLabel";
5+
import MenuItem from "@mui/material/MenuItem";
6+
import FormControl from "@mui/material/FormControl";
7+
import Select, { SelectChangeEvent } from "@mui/material/Select";
8+
import Typography from "@mui/material/Typography";
9+
import type { User } from "./Emulator";
10+
11+
export default function DropDown(props: {
12+
users: User[];
13+
handleClose: (user: User) => void;
14+
}) {
15+
const { users, handleClose: handleUser } = props;
16+
17+
const [name, setName] = React.useState("");
18+
19+
const handleChange = (event: SelectChangeEvent) => {
20+
setName(event.target.value as string);
21+
};
22+
23+
return (
24+
<>
25+
<Typography color="text.secondary" sx={{ my: 1, marginLeft: 10 }}>
26+
もしくは
27+
</Typography>
28+
<Box sx={{ display: "flex", marginLeft: 10, marginBottom: 10 }}>
29+
<Box sx={{ width: 100 }}>
30+
<FormControl fullWidth>
31+
<InputLabel id="demo-simple-select-label">名前</InputLabel>
32+
<Select
33+
labelId="demo-simple-select-label"
34+
id="demo-simple-select"
35+
value={name}
36+
label="User"
37+
onChange={handleChange}
38+
>
39+
{users.map((user) => (
40+
<MenuItem value={user.name} key={user.id}>
41+
{user.name}
42+
</MenuItem>
43+
))}
44+
</Select>
45+
</FormControl>
46+
</Box>
47+
<Button
48+
onClick={() => {
49+
const user = users.find((eachUser) => eachUser.name === name);
50+
if (!user) throw Error();
51+
handleUser(user);
52+
}}
53+
variant="outlined"
54+
>
55+
でログイン
56+
</Button>
57+
</Box>
58+
</>
59+
);
60+
}

packages/web/src/component/TestPlay.tsx

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,19 @@ export default function TestPlay(props: TestPlayProps) {
251251
useEffect(() => {
252252
const fetchUsers = async () => {
253253
const response = await getUsers();
254+
const copy = response
255+
.filter((user) => user.id !== currentUser.id)
256+
.slice();
257+
const newEnemyIds = [...Array(3)].map(
258+
() => copy.splice(Math.floor(Math.random() * copy.length), 1)[0]?.id
259+
) as number[];
260+
setEnemyIds(newEnemyIds);
254261
setUsers(response);
255262
};
256263
fetchUsers();
257-
}, []);
264+
}, [currentUser.id]);
265+
266+
const usersExceptMe = users?.filter((user) => user.id !== currentUser.id);
258267

259268
const [isActive, setIsActive] = useState(false);
260269
const [executionId, setExecutionId] = useState(1);
@@ -453,9 +462,9 @@ export default function TestPlay(props: TestPlayProps) {
453462
</Box>
454463
</AccordionDetails>
455464
</Accordion>
456-
{users ? (
465+
{users && usersExceptMe ? (
457466
<EnemyDialog
458-
users={users}
467+
users={usersExceptMe}
459468
enemyIds={enemyIds}
460469
selectedEnemyIds={selectedEnemyIds}
461470
setSelectedEnemyIds={setSelectedEnemyIds}

packages/web/src/component/Welcome.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,16 @@ import {
1414
import type { User } from "./game";
1515
import iconURL from "../icon1.svg";
1616
import { createUser } from "../fetchAPI";
17+
import DropDown from "./DropDown";
1718

1819
interface WelcomeProps {
1920
// currentUser: User;
2021
setCurrentUser: (value: User) => void;
22+
users: User[];
2123
}
2224

2325
export default function Welcome(props: WelcomeProps) {
24-
const { /* currentUser, */ setCurrentUser } = props;
26+
const { /* currentUser, */ setCurrentUser, users } = props;
2527
const [open, setOpen] = useState(true);
2628
const [name, setName] = useState("");
2729
const [selectedIcon, setSelectedIcon] = useState(0);
@@ -99,6 +101,13 @@ export default function Welcome(props: WelcomeProps) {
99101
開始
100102
</Button>
101103
</DialogActions>
104+
<DropDown
105+
users={users}
106+
handleClose={(user: User) => {
107+
setCurrentUser(user);
108+
setOpen(false);
109+
}}
110+
/>
102111
</Dialog>
103112
</div>
104113
);

0 commit comments

Comments
 (0)