/*
Copyright © XlXi 2022
*/
import { Component } from 'react';
import classNames from 'classnames/bind';
import axios from 'axios';
import Twemoji from 'react-twemoji';
import { buildGenericApiUrl } from '../util/HTTP.js';
import ProgressiveImage from './ProgressiveImage';
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}`;
}
function commaSeparate(num) {
let str = num.toString().split('.');
str[0] = str[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
return str.join('.');
}
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 'string':
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.setPage(1, true, () => {
this.props.navigateCategory(this.props.id, this.data);
});
}
render() {
return (
{ this.props.label }
);
}
}
class ShopCategories extends Component {
constructor(props) {
super(props);
}
render() {
return (
Category
{
Object.keys(shopCategories).map((categoryName, index) =>
-
{ categoryName }
{
shopCategories[categoryName].map(({label, assetTypeId, gearGenreId}, index) =>
)
}
)
}
);
}
}
class ShopItemCard extends Component {
constructor(props) {
super(props);
this.state = {
hovered: false
}
}
render() {
var item = this.props.item;
return (
this.setState({hovered: true})}
onMouseLeave={() => this.setState({hovered: false})}
>
{ item.Name }
{ item.OnSale ?
{commaSeparate(item.Price)}
:
Offsale
}
{
this.state.hovered ?
:
null
}
);
}
}
class Shop extends Component {
constructor(props) {
super(props);
this.state = {
selectedCategoryId: -1,
pageItems: [],
pageLoaded: true,
pageNumber: null,
pageCount: null,
error: false,
dataMem: false
};
this.navigateCategory = this.navigateCategory.bind(this);
this.incrementPage = this.incrementPage.bind(this);
this.setPage = this.setPage.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, dataraw) {
if(this.state.pageLoaded == false) return;
this.setState({selectedCategoryId: categoryId, dataMem: dataraw, pageLoaded: false});
let url = buildGenericApiUrl('api', 'shop/v1/list-json');
if (this.state.pageNumber == null || this.state.pageNumber == 1)
this.setState({pageNumber: 1});
let paramIterator = 0;
let data = {...dataraw, page: this.state.pageNumber};
Object.keys(data).filter(key => {
if (key == 'label')
return false;
else if (key == 'page' && (data[key] == null || data[key] == 1))
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, 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();
});
}
incrementPage(amount) {
this.setPage(this.state.pageNumber + amount);
}
setPage(page, bypass = false, callback) {
if(!bypass && this.state.pageLoaded == false) return;
this.setState({pageNumber: page}, () => {
if(callback)
callback();
if(!bypass)
this.navigateCategory(this.state.selectedCategoryId, this.state.dataMem);
});
}
render() {
return (
{
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((item, index) =>
)
}
}
{
this.state.pageCount > 1 ?
:
null
}
);
}
}
export default Shop;