Commit 12f150aa authored by Chunchi Che's avatar Chunchi Che

Merge branch 'feat/deck/choose' into 'main'

add upload ydk function

See merge request !103
parents 3e96018c 67423dc3
Pipeline #20103 passed with stages
in 4 minutes and 51 seconds
...@@ -30,3 +30,58 @@ function _objToMap(object: any): Map<string, IDeck> { ...@@ -30,3 +30,58 @@ function _objToMap(object: any): Map<string, IDeck> {
return map; return map;
} }
export function parseYdk(text: string): IDeck | undefined {
const lineIter = text.split("\n");
const deck: { main: number[]; extra: number[]; side: number[] } = {
main: [],
extra: [],
side: [],
};
let flag = -1;
for (const line of lineIter) {
switch (line) {
case "#main\r": {
flag = 1;
break;
}
case "#extra\r": {
flag = 2;
break;
}
case "!side\r": {
flag = 3;
break;
}
default: {
let code = Number(line);
if (!isNaN(code)) {
if (code > 100) {
switch (flag) {
case 1: {
deck.main.push(code);
break;
}
case 2: {
deck.extra.push(code);
break;
}
case 3: {
deck.side.push(code);
break;
}
default: {
break;
}
}
}
}
break;
}
}
}
return deck.main.length == 0 ? undefined : deck;
}
...@@ -6,6 +6,8 @@ import { ...@@ -6,6 +6,8 @@ import {
Button, Button,
Dropdown, Dropdown,
notification, notification,
Upload,
message,
} from "antd"; } from "antd";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import React, { useState, useEffect } from "react"; import React, { useState, useEffect } from "react";
...@@ -20,7 +22,7 @@ import { ...@@ -20,7 +22,7 @@ import {
import { useAppSelector } from "../hook"; import { useAppSelector } from "../hook";
import { selectJoined } from "../reducers/joinSlice"; import { selectJoined } from "../reducers/joinSlice";
import { selectChat } from "../reducers/chatSlice"; import { selectChat } from "../reducers/chatSlice";
import { fetchDeck } from "../api/deck"; import { fetchDeck, IDeck, parseYdk } from "../api/deck";
import { import {
sendUpdateDeck, sendUpdateDeck,
sendHsReady, sendHsReady,
...@@ -34,9 +36,10 @@ import { ...@@ -34,9 +36,10 @@ import {
SendOutlined, SendOutlined,
DownOutlined, DownOutlined,
TagOutlined, TagOutlined,
UploadOutlined,
} from "@ant-design/icons"; } from "@ant-design/icons";
import { initMeExtraDeckMeta } from "../reducers/duel/extraDeckSlice"; import { initMeExtraDeckMeta } from "../reducers/duel/extraDeckSlice";
import type { MenuProps } from "antd"; import type { MenuProps, UploadProps } from "antd";
import { Link, useParams } from "react-router-dom"; import { Link, useParams } from "react-router-dom";
const READY_STATE = "ready"; const READY_STATE = "ready";
...@@ -84,22 +87,52 @@ const WaitRoom = () => { ...@@ -84,22 +87,52 @@ const WaitRoom = () => {
const [api, contextHolder] = notification.useNotification(); const [api, contextHolder] = notification.useNotification();
const [deckTitle, setDeckTitle] = useState("请选择卡组"); const [deckTitle, setDeckTitle] = useState("请选择卡组");
// FIXME: 这些数据应该从`store`中获取 // FIXME: 这些数据应该从`store`中获取
// TODO: 云卡组
const decks: MenuProps["items"] = [ const decks: MenuProps["items"] = [
{ {
label: "hero", label: "hero",
key: "hero", key: "hero",
}, },
]; ];
const [uploadState, setUploadState] = useState("");
const uploadProps: UploadProps = {
name: "file",
onChange(info) {
if (uploadState != "ERROR") {
info.file.status = "done";
}
},
beforeUpload(file, _) {
const reader = new FileReader();
reader.readAsText(file);
reader.onload = (e) => {
const text = e.target?.result as string;
const deck = parseYdk(text);
if (deck) {
// YDK解析成功
message.success(`${file.name}解析成功`);
const handleChoseDeck = async (deckName: string) => { onDeckReady(deck);
const deck = await fetchDeck(deckName); } else {
message.error(`${file.name}解析失败`);
setUploadState("ERROR");
}
};
},
};
const onDeckReady = (deck: IDeck) => {
sendUpdateDeck(deck); sendUpdateDeck(deck);
dispatch(initMeExtraDeckMeta({ controler: 0, codes: deck.extra || [] })); dispatch(initMeExtraDeckMeta({ controler: 0, codes: deck.extra || [] }));
setChoseDeck(true); setChoseDeck(true);
}; };
const handleChoseDeck = async (deckName: string) => {
const deck = await fetchDeck(deckName);
onDeckReady(deck);
};
const handleChoseReady = () => { const handleChoseReady = () => {
sendHsReady(); sendHsReady();
}; };
...@@ -206,6 +239,7 @@ const WaitRoom = () => { ...@@ -206,6 +239,7 @@ const WaitRoom = () => {
<></> <></>
)} )}
</Space> </Space>
<Space wrap size={16}>
<Dropdown <Dropdown
menu={{ menu={{
items: decks, items: decks,
...@@ -223,6 +257,14 @@ const WaitRoom = () => { ...@@ -223,6 +257,14 @@ const WaitRoom = () => {
</a> </a>
</Dropdown> </Dropdown>
</Space> </Space>
<Space>
<Upload {...uploadProps}>
<Button icon={<UploadOutlined />}>
没有卡组?点击上传YDK文件
</Button>
</Upload>
</Space>
</Space>
</Modal> </Modal>
{contextHolder} {contextHolder}
</> </>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment