Commit 2e1d3d4c authored by Chunchi Che's avatar Chunchi Che

Merge branch 'fix/mdproDeck' into 'main'

fix the mdproDeck implemetaion

See merge request !420
parents d76858d3 246e95d2
Pipeline #41978 passed with stages
in 2 minutes and 27 seconds
......@@ -42,7 +42,7 @@
"uuid": "^9.0.0",
"valtio": "^1.11.2",
"vite-plugin-svgr": "^3.2.0",
"ygopro-deck-encode": "^1.0.3"
"ygopro-deck-encode": "^1.0.14"
},
"devDependencies": {
"@types/google-protobuf": "^3.15.6",
......@@ -67,7 +67,6 @@
"vite": "^4.4.9",
"vite-plugin-arraybuffer": "^0.0.6",
"vite-plugin-sass-dts": "^1.3.9",
"vite-plugin-wasm-pack": "^0.1.12",
"vite-tsconfig-paths": "^4.2.0",
"vite-ydk-loader": "^0.0.2"
}
......@@ -3844,20 +3843,6 @@
"is-callable": "^1.1.3"
}
},
"node_modules/fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
......@@ -4646,11 +4631,6 @@
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
"node_modules/js-base64": {
"version": "3.7.5",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz",
"integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA=="
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
......@@ -4714,18 +4694,6 @@
"node": ">=6"
}
},
"node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
......@@ -4882,12 +4850,6 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/narrowing": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/narrowing/-/narrowing-1.5.0.tgz",
"integrity": "sha512-DUu4XdKgkfAPTAL28k79pdnshDE2W5T24QAnidSPo2F/W1TX6CjNzmEeXQfE5O1lxQvC0GYI6ZRDsLcyzugEYA==",
"dev": true
},
"node_modules/natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
......@@ -6975,15 +6937,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true,
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/untildify": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
......@@ -7179,17 +7132,6 @@
"vite": "^2.6.0 || 3 || 4"
}
},
"node_modules/vite-plugin-wasm-pack": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/vite-plugin-wasm-pack/-/vite-plugin-wasm-pack-0.1.12.tgz",
"integrity": "sha512-WliYvQp9HXluir4OKGbngkcKxtYtifU11cqLurRRJGsl770Sjr1iIkp5RuvU3IC1poT4A57Z2/YgAKI2Skm7ZA==",
"dev": true,
"dependencies": {
"chalk": "^4.1.2",
"fs-extra": "^10.0.0",
"narrowing": "^1.4.0"
}
},
"node_modules/vite-tsconfig-paths": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz",
......@@ -7296,12 +7238,9 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
},
"node_modules/ygopro-deck-encode": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/ygopro-deck-encode/-/ygopro-deck-encode-1.0.3.tgz",
"integrity": "sha512-5JpaAdrIO4d2VnQRm+6T9S3JEp8ByXrFmXumAtCScvGYSc/31ianjafe76XVIFA8nSDJJCO8bzJF+C6CBwUONg==",
"dependencies": {
"js-base64": "^3.7.5"
}
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/ygopro-deck-encode/-/ygopro-deck-encode-1.0.14.tgz",
"integrity": "sha512-Q64f8U+okLBDKHw02eRYsdDMpALhYa55k0BhFqZ5k4ntRpPKFNvM9sNEbBlg2bmyi6LCf3rlEmISmLtlx9uDeA=="
},
"node_modules/yocto-queue": {
"version": "0.1.0",
......@@ -9907,17 +9846,6 @@
"is-callable": "^1.1.3"
}
},
"fs-extra": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
"integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
......@@ -10459,11 +10387,6 @@
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
"js-base64": {
"version": "3.7.5",
"resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz",
"integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA=="
},
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
......@@ -10512,16 +10435,6 @@
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
},
"jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6",
"universalify": "^2.0.0"
}
},
"levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
......@@ -10636,12 +10549,6 @@
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="
},
"narrowing": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/narrowing/-/narrowing-1.5.0.tgz",
"integrity": "sha512-DUu4XdKgkfAPTAL28k79pdnshDE2W5T24QAnidSPo2F/W1TX6CjNzmEeXQfE5O1lxQvC0GYI6ZRDsLcyzugEYA==",
"dev": true
},
"natural-compare": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
......@@ -12074,12 +11981,6 @@
"which-boxed-primitive": "^1.0.2"
}
},
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true
},
"untildify": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
......@@ -12166,17 +12067,6 @@
"@svgr/plugin-jsx": "^7.0.0"
}
},
"vite-plugin-wasm-pack": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/vite-plugin-wasm-pack/-/vite-plugin-wasm-pack-0.1.12.tgz",
"integrity": "sha512-WliYvQp9HXluir4OKGbngkcKxtYtifU11cqLurRRJGsl770Sjr1iIkp5RuvU3IC1poT4A57Z2/YgAKI2Skm7ZA==",
"dev": true,
"requires": {
"chalk": "^4.1.2",
"fs-extra": "^10.0.0",
"narrowing": "^1.4.0"
}
},
"vite-tsconfig-paths": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz",
......@@ -12257,12 +12147,9 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
},
"ygopro-deck-encode": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/ygopro-deck-encode/-/ygopro-deck-encode-1.0.3.tgz",
"integrity": "sha512-5JpaAdrIO4d2VnQRm+6T9S3JEp8ByXrFmXumAtCScvGYSc/31ianjafe76XVIFA8nSDJJCO8bzJF+C6CBwUONg==",
"requires": {
"js-base64": "^3.7.5"
}
"version": "1.0.14",
"resolved": "https://registry.npmjs.org/ygopro-deck-encode/-/ygopro-deck-encode-1.0.14.tgz",
"integrity": "sha512-Q64f8U+okLBDKHw02eRYsdDMpALhYa55k0BhFqZ5k4ntRpPKFNvM9sNEbBlg2bmyi6LCf3rlEmISmLtlx9uDeA=="
},
"yocto-queue": {
"version": "0.1.0",
......
......@@ -37,7 +37,7 @@
"uuid": "^9.0.0",
"valtio": "^1.11.2",
"vite-plugin-svgr": "^3.2.0",
"ygopro-deck-encode": "^1.0.3"
"ygopro-deck-encode": "^1.0.14"
},
"scripts": {
"dev": "vite",
......
......@@ -5,13 +5,23 @@ import { MdproResp } from "./schema";
import { mdproHeaders } from "./util";
const { mdproServer } = useConfig();
const API_PATH = "/api/mdpro3/sync/single";
const API_PATH = "api/mdpro3/sync/single";
interface DeleteReq {
userId: number;
deckContributor: string;
deck: {
deckId: string;
deckName: string;
deckType: string;
deckCoverCard1: number;
deckCoverCard2: number;
deckCoverCard3: number;
deckCase: number;
deckProtector: number;
deckYdk: string;
isDelete: boolean;
timestamp: number;
};
}
......@@ -19,6 +29,7 @@ export async function deleteDeck(
userID: number,
token: string,
deckID: string,
deckContributor: string = "", // Added parameter with default
): Promise<MdproResp<boolean> | undefined> {
const myHeaders = mdproHeaders();
myHeaders.append("Content-Type", "application/json");
......@@ -26,9 +37,19 @@ export async function deleteDeck(
const req: DeleteReq = {
userId: userID,
deckContributor: deckContributor,
deck: {
deckId: deckID,
deckName: "", // Required but not used for delete
deckType: "", // Required field
deckCoverCard1: 0, // Required field
deckCoverCard2: 0, // Required field
deckCoverCard3: 0, // Required field
deckCase: 0, // Required field
deckProtector: 0, // Required field
deckYdk: "", // Required but not used for delete
isDelete: true,
timestamp: Date.now(),
},
};
......
......@@ -6,7 +6,7 @@ import { mdproHeaders } from "./util";
const { mdproServer } = useConfig();
const API_PATH = "/api/mdpro3/deck/deckId";
const API_PATH = "api/mdpro3/deck/deckId";
export async function generateDeck(): Promise<MdproResp<string> | undefined> {
const myHeaders = mdproHeaders();
......
......@@ -6,7 +6,7 @@ import { mdproHeaders } from "./util";
const { mdproServer } = useConfig();
const API_PATH = "/api/mdpro3/deck";
const API_PATH = "api/mdpro3/deck";
export async function mgetDeck(
id: string,
......
......@@ -6,7 +6,7 @@ import { MdproDeck, MdproResp } from "./schema";
import { mdproHeaders } from "./util";
const { mdproServer } = useConfig();
const API_PATH = "/api/mdpro3/sync/";
const API_PATH = "api/mdpro3/sync";
export interface PersonalListReq {
/* ID of MyCard Account */
......
......@@ -19,13 +19,19 @@ export interface MdproDeck {
deckName: string;
deckRank?: number;
deckLike?: number;
deckUploadDate?: string;
deckUpdateDate?: string;
deckUploadDate?: number; // Changed to number (13-digit timestamp)
deckUpdateDate?: number; // Changed to number (13-digit timestamp)
deckCoverCard1?: number; // NEW: Cover card 1 ID
deckCoverCard2?: number; // NEW: Cover card 2 ID
deckCoverCard3?: number; // NEW: Cover card 3 ID
/* Content of the deck. */
deckYdk?: string;
deckCase: number;
deckProtector?: number; // NEW: Card protector/sleeve
/* User ID of MyCard Account */
userId: number;
isDelete?: boolean; // NEW: Whether deck is deleted
isPublic?: boolean; // NEW: Whether deck is public
}
export interface MdproDeckLike {
......@@ -33,6 +39,10 @@ export interface MdproDeckLike {
deckContributor: string;
deckName: string;
deckLike?: number;
deckCoverCard1?: number; // NEW: Cover card 1 ID
deckCoverCard2?: number; // NEW: Cover card 2 ID
deckCoverCard3?: number; // NEW: Cover card 3 ID
deckCase: number;
lastDate?: string;
deckProtector?: number; // NEW: Card protector/sleeve
lastDate?: number; // Changed to number (timestamp)
}
......@@ -5,7 +5,7 @@ import { MdproResp } from "./schema";
import { mdproHeaders } from "./util";
const { mdproServer } = useConfig();
const API_PATH = "/api/mdpro3/sync/single";
const API_PATH = "api/mdpro3/sync/single";
export interface SyncReq {
userId: number;
......@@ -13,8 +13,15 @@ export interface SyncReq {
deck: {
deckId: string;
deckName: string;
deckType?: string; // NEW: Deck type/category (optional, can use empty string)
deckCoverCard1?: number; // NEW: Cover card 1
deckCoverCard2?: number; // NEW: Cover card 2
deckCoverCard3?: number; // NEW: Cover card 3
deckCase: number;
deckProtector?: number; // NEW: Card protector/sleeve
deckYdk: string;
isDelete?: boolean; // NEW: Whether this is a delete operation
timestamp?: number; // NEW: Update timestamp (10 or 13 digit)
};
}
......
......@@ -5,7 +5,7 @@ import { MdproResp } from "./schema";
import { mdproHeaders } from "./util";
const { mdproServer } = useConfig();
const API_PATH = "/api/mdpro3/deck/public";
const API_PATH = "api/mdpro3/deck/public";
export interface UpdatePublicReq {
userId: number;
......
......@@ -32,8 +32,15 @@ export async function uploadDeck(
deck: {
deckId,
deckName: req.deck.deckName,
deckType: "", // NEW: Default empty string for deck type
deckCoverCard1: 0, // NEW: Default to 0
deckCoverCard2: 0, // NEW: Default to 0
deckCoverCard3: 0, // NEW: Default to 0
deckCase: req.deck.deckCase,
deckProtector: 0, // NEW: Default to 0
deckYdk: req.deck.deckYdk,
isDelete: false, // NEW: Not a delete operation
timestamp: Date.now(), // NEW: Current timestamp
},
},
req.token,
......
......@@ -107,7 +107,12 @@ const MdproDeckBlock: React.FC<{
const onDelete = async () => {
if (user) {
const resp = await deleteDeck(user.id, user.token, deck.deckId);
const resp = await deleteDeck(
user.id,
user.token,
deck.deckId,
user.username,
);
if (resp?.code === 0 && resp.data === true) {
message.success(
......
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