import {useShopStore} from "./shop_store"; import {FilterOptions} from "./options/utils"; import {v4 as uuidv4} from "uuid"; export function validateJSON(description) { let crates_raw; try { const parsed = JSON.parse(description); // here we can check additional fields crates_raw = parsed.crates; } catch (e) { return false; } const crate_modes = useShopStore.getState().crate_modes; const modes_order = useShopStore.getState().modes_order; const pn_to_card = useShopStore.getState().pn_to_cards; try { for (const crate of crates_raw) { if (!crate.type || !crate.items || !(crate.type in crate_modes)) return false; for (const card of crate.items) { if (!(card.pn in pn_to_card) || card.options === undefined) return false; } } } catch (e) { return false; } // only last one should be spare cards return crates_raw.filter((crate) => !modes_order.includes(crate.type)).length === 1 && crates_raw[crates_raw.length - 1].type === "no_crate"; } // no validation in this function export function JSONToCrates(description) { const parsed = JSON.parse(description); const crates_raw = parsed.crates; const pn_to_card = useShopStore.getState().getCardDescriptionByPn; const fanTrayAvailable = useShopStore.getState().fanTrayAvailableForMode; const crates = Array.from(crates_raw.map((crate, c_i) => ({ id: crate.type === "no_crate" ? "spare" : "crate" + c_i, name: crate.type === "no_crate" ? "Spare cards" : undefined, fan_tray: fanTrayAvailable(crate.type) && crate.fan_tray === true, crate_mode: crate.type, items: Array.from(crate.items.map((card, _i) => ({ ...pn_to_card(card.pn), id: uuidv4(), options_data: card.options || {} }))), warnings: [], occupiedHP: 0, }))); return { // some additional fields go here crates: crates }; } export function CratesToJSON(crates) { const fanTrayAvailable = useShopStore.getState().fanTrayAvailableForMode; return JSON.stringify({ // additional fields can go here crates: Array.from(crates.map((crate, _i) => ({ items: Array.from(crate.items.map((card, _) => ({ pn: card.name_number, options: (card.options_data && card.options) ? FilterOptions(card.options, card.options_data) : null }))), type: crate.crate_mode, fan_tray: (!fanTrayAvailable(crate.crate_mode) ? undefined : true) && crate.fan_tray }))) }, null, 2) }