/* Graphictoria 5 (https://gtoria.net) Copyright © XlXi 2022 */ import { Component, createRef } from 'react'; import classNames from 'classnames/bind'; import axios from 'axios'; import Twemoji from 'react-twemoji'; import { buildGenericApiUrl } from '../util/HTTP.js'; import Loader from './Loader'; axios.defaults.withCredentials = true; const shopCategories = { 'Clothing': [ { label: 'Hats', assetTypeId: 8 }, { label: 'Shirts', assetTypeId: 11 }, { label: 'T-Shirts', assetTypeId: 2 }, { label: 'Pants', assetTypeId: 12 }, { label: 'Package', assetTypeId: 32 } ], 'Body Parts': [ { label: 'Heads', assetTypeId: 17 }, { label: 'Faces', assetTypeId: 18 }, { label: 'Packages', assetTypeId: 32 } ], 'Gear': [ { label: 'Building', assetTypeId: 19, gearGenreId: 7 }, { label: 'Explosive', assetTypeId: 19, gearGenreId: 2 }, { label: 'Melee', assetTypeId: 19, gearGenreId: 0 }, { label: 'Musical', assetTypeId: 19, gearGenreId: 5 }, { label: 'Navigation', assetTypeId: 19, gearGenreId: 4 }, { label: 'Power Up', assetTypeId: 19, gearGenreId: 3 }, { label: 'Ranged', assetTypeId: 19, gearGenreId: 1 }, { label: 'Social', assetTypeId: 19, gearGenreId: 6 }, { label: 'Transport', assetTypeId: 19, gearGenreId: 8 } ] }; function makeCategoryId(originalName, category) { return `shop-${originalName.toLowerCase().replaceAll(' ', '-')}-${category}`; } class ShopCategoryButton extends Component { constructor(props) { super(props); this.handleClick = this.handleClick.bind(this); } componentDidMount() { if (this.props.id === 'all') { let assetTypes = []; Object.keys(shopCategories).map((categoryName) => { let categoryAssetTypeIds = this.props.getCategoryAssetTypeIds(categoryName); switch(typeof(categoryAssetTypeIds.assetTypeId)) { case 'number': assetTypes[categoryAssetTypeIds.assetTypeId] = true; break; case 'object': categoryAssetTypeIds.assetTypeId.map((assetTypeId) => { assetTypes[assetTypeId] = true; }); break; } }); this.data = {assetTypeId: Object.keys(assetTypes)}; } else if (this.props.id.startsWith('shop-all')) { this.data = this.props.getCategoryAssetTypeIds(this.props.categoryName); } else { this.data = this.props.getCategoryAssetTypeByLabel(this.props.categoryName, this.props.label); } if (this.props.id == 'shop-hats-clothing-type') this.props.navigateCategory(this.props.id, this.data); } handleClick() { this.props.navigateCategory(this.props.id, this.data); } render() { return ( { this.props.label } ); } } class ShopCategories extends Component { constructor(props) { super(props); } render() { return (
Category
); } } class Shop extends Component { constructor(props) { super(props); this.state = { selectedCategoryId: -1, pageItems: [], pageLoaded: true, pageNumber: null, pageCount: null, error: false }; this.navigateCategory = this.navigateCategory.bind(this); } getCategoryAssetTypeIds(categoryName) { let assetTypes = []; shopCategories[categoryName].map(({assetTypeId}) => { assetTypes[assetTypeId] = true; }); assetTypes = Object.keys(assetTypes); if (assetTypes.length == 1) assetTypes = assetTypes[0]; return {assetTypeId: assetTypes}; } getCategoryAssetTypeByLabel(categoryName, label) { let assetType = -1; shopCategories[categoryName].map((sort) => { if (sort.label === label) { assetType = sort; } }); return assetType; } navigateCategory(categoryId, data) { this.setState({selectedCategoryId: categoryId, pageLoaded: false}); let url = buildGenericApiUrl('api', 'shop/v1/list-json'); let paramIterator = 0; Object.keys(data).filter(key => { if (key == 'label') return false; return true; }).map(key => { url += ((paramIterator++ == 0 ? '?' : '&') + `${key}=${data[key]}`); }); axios.get(url) .then(res => { const items = res.data; this.setState({ pageItems: items.data, pageCount: items.pages, pageNumber: 1, pageLoaded: true, error: false }); }).catch(err => { const data = err.response.data; let errorMessage = 'An error occurred while processing your request.'; if(data.errors) errorMessage = data.errors[0].message; this.setState({ pageItems: [], pageCount: 1, pageNumber: 1, pageLoaded: true, error: errorMessage }); this.inputBox.current.focus(); }); } render() { return (

Shop

{ this.state.error ?
{this.state.error}
: null } { !this.state.pageLoaded ?
: null } { (this.state.pageItems.length == 0 && !this.state.error) ?

Nothing found.

:
{ this.state.pageItems.map(({Name, Creator, Thumbnail, Url}, index) =>

{ Name }

{ /* TODO: XlXi: price */ }

Todo123

) }
}
{ this.state.pageCount > 1 ?
  • Page   of { this.state.pageCount || '???' }
: null }
); } } export default Shop;