Commit 4e07b786 authored by Chunchi Che's avatar Chunchi Che

handle upload deck

parent 5f6189bb
Pipeline #27618 passed with stages
in 8 minutes and 53 seconds
...@@ -16,6 +16,7 @@ export async function uploadDeck( ...@@ -16,6 +16,7 @@ export async function uploadDeck(
req: MdproDeck, req: MdproDeck,
): Promise<UploadResp | undefined> { ): Promise<UploadResp | undefined> {
const myHeaders = mdproHeaders(); const myHeaders = mdproHeaders();
myHeaders.append("Content-Type", "application/json");
const resp = await fetch(`${mdproServer}/${API_PATH}`, { const resp = await fetch(`${mdproServer}/${API_PATH}`, {
method: "POST", method: "POST",
......
...@@ -4,18 +4,24 @@ import { ...@@ -4,18 +4,24 @@ import {
DownloadOutlined, DownloadOutlined,
FileAddOutlined, FileAddOutlined,
PlusOutlined, PlusOutlined,
UploadOutlined,
} from "@ant-design/icons"; } from "@ant-design/icons";
import { App, Button, Dropdown, MenuProps, UploadProps } from "antd"; import { App, Button, Dropdown, MenuProps, UploadProps } from "antd";
import React, { useRef, useState } from "react"; import React, { useRef, useState } from "react";
import YGOProDeck from "ygopro-deck-encode"; import YGOProDeck from "ygopro-deck-encode";
import { deckStore, IDeck } from "@/stores"; import { uploadDeck } from "@/api";
import { MdproDeck } from "@/api/mdproDeck/schema";
import { accountStore, deckStore, IDeck } from "@/stores";
import { Uploader } from "../../Shared"; import { Uploader } from "../../Shared";
import { genYdkText } from "../utils";
import styles from "./index.module.scss"; import styles from "./index.module.scss";
const DEFAULT_DECK_CASE = 1082012;
export const DeckSelect: React.FC<{ export const DeckSelect: React.FC<{
decks: readonly { deckName: string }[]; decks: IDeck[];
selected: string; selected: string;
onSelect: (deckName: string) => any; onSelect: (deckName: string) => any;
onDelete: (deckName: string) => Promise<any>; onDelete: (deckName: string) => Promise<any>;
...@@ -120,25 +126,52 @@ export const DeckSelect: React.FC<{ ...@@ -120,25 +126,52 @@ export const DeckSelect: React.FC<{
}, },
].map((_, key) => ({ ..._, key })); ].map((_, key) => ({ ..._, key }));
const onUploadMdDeck = async (deck: IDeck) => {
const user = accountStore.user;
if (user) {
// TODO: Deck Case
const mdproDeck: MdproDeck = {
deckId: "",
deckContributor: user.username,
deckName: deck.deckName,
deckYdk: genYdkText(deck),
deckCase: DEFAULT_DECK_CASE,
};
const resp = await uploadDeck(mdproDeck);
if (resp) {
if (resp.code) {
message.error(resp.message);
} else {
message.success(`上传在线卡组<${deck.deckName}>成功!`);
}
} else {
message.error("上传在线卡组失败,请检查网络状况。");
}
} else {
message.error("需要先登录萌卡账号才能上传在线卡组!");
}
};
return ( return (
<> <>
<div className={styles["deck-select"]}> <div className={styles["deck-select"]}>
{decks.map(({ deckName }) => ( {decks.map((deck) => (
<div <div
key={deckName} key={deck.deckName}
className={styles.item} className={styles.item}
onClick={() => onSelect(deckName)} onClick={() => onSelect(deck.deckName)}
> >
<div className={styles.hover} /> <div className={styles.hover} />
{selected === deckName && <div className={styles.selected} />} {selected === deck.deckName && <div className={styles.selected} />}
<span>{deckName}</span> <span>{deck.deckName}</span>
<div className={styles.btns}> <div className={styles.btns}>
<Button <Button
icon={<CopyOutlined />} icon={<CopyOutlined />}
type="text" type="text"
size="small" size="small"
onClick={cancelBubble(async () => { onClick={cancelBubble(async () => {
const result = await onCopy(deckName); const result = await onCopy(deck.deckName);
result result
? message.success("复制成功") ? message.success("复制成功")
: message.error("复制失败"); : message.error("复制失败");
...@@ -149,7 +182,7 @@ export const DeckSelect: React.FC<{ ...@@ -149,7 +182,7 @@ export const DeckSelect: React.FC<{
type="text" type="text"
size="small" size="small"
onClick={cancelBubble(async () => { onClick={cancelBubble(async () => {
await onDelete(deckName); await onDelete(deck.deckName);
onSelect(decks[0].deckName); onSelect(decks[0].deckName);
})} })}
/> />
...@@ -158,7 +191,13 @@ export const DeckSelect: React.FC<{ ...@@ -158,7 +191,13 @@ export const DeckSelect: React.FC<{
icon={<DownloadOutlined />} icon={<DownloadOutlined />}
type="text" type="text"
size="small" size="small"
onClick={cancelBubble(() => onDownload(deckName))} onClick={cancelBubble(() => onDownload(deck.deckName))}
/>
<Button
icon={<UploadOutlined />}
type="text"
size="small"
onClick={cancelBubble(async () => onUploadMdDeck(deck))}
/> />
</div> </div>
</div> </div>
......
...@@ -116,7 +116,7 @@ export const Component: React.FC = () => { ...@@ -116,7 +116,7 @@ export const Component: React.FC = () => {
<div className={styles.sider}> <div className={styles.sider}>
<ScrollableArea className={styles["deck-select-container"]}> <ScrollableArea className={styles["deck-select-container"]}>
<DeckSelect <DeckSelect
decks={snapDecks.decks} decks={snapDecks.decks as IDeck[]}
selected={selectedDeck.deckName} selected={selectedDeck.deckName}
onSelect={(name) => onSelect={(name) =>
setSelectedDeck(deckStore.get(name) ?? emptyDeck) setSelectedDeck(deckStore.get(name) ?? emptyDeck)
......
...@@ -38,7 +38,7 @@ export const compareCards = (a: CardMeta, b: CardMeta): number => { ...@@ -38,7 +38,7 @@ export const compareCards = (a: CardMeta, b: CardMeta): number => {
}; };
/** 生成ydk格式的卡组文本 */ /** 生成ydk格式的卡组文本 */
function genYdkText(deck: IDeck): string { export function genYdkText(deck: IDeck): string {
const { main, extra, side } = deck; const { main, extra, side } = deck;
const lines = [ const lines = [
......
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