/*
Copyright © XlXi 2022
*/
import { createRef, Component } from 'react';
import axios from 'axios';
import classNames from 'classnames/bind';
import ProgressiveImage from './ProgressiveImage';
import { buildGenericApiUrl } from '../util/HTTP.js';
axios.defaults.withCredentials = true;
const itemId = 'vb-item';
class PurchaseConfirmationModal extends Component {
constructor(props) {
super(props);
this.state = {
buttonDisabled: true
};
this.ModalRef = createRef();
this.Modal = null;
this.purchaseAsset = this.purchaseAsset.bind(this);
}
componentDidMount() {
let itemElement = document.getElementById(itemId);
if(itemElement) {
this.setState({
assetId: itemElement.getAttribute('data-asset-id'),
assetName: itemElement.getAttribute('data-asset-name'),
assetCreator: itemElement.getAttribute('data-asset-creator'),
assetType: itemElement.getAttribute('data-asset-type'),
assetPrice: parseInt(itemElement.getAttribute('data-asset-price')),
assetThumbnail: itemElement.getAttribute('data-asset-thumbnail-2d'),
userTokens: parseInt(itemElement.getAttribute('data-user-currency'))
});
}
this.Modal = new Bootstrap.Modal(this.ModalRef.current);
this.Modal.show();
this.ModalRef.current.addEventListener('hidden.bs.modal', (event) => {
this.props.setModal(null);
})
setTimeout(function(){
this.setState({buttonDisabled: false});
}.bind(this), 1000);
}
componentWillUnmount() {
this.Modal.dispose();
}
purchaseAsset() {
console.log('hi');
if(this.state.buttonDisabled) return;
this.setState({buttonDisabled: true});
axios.post(buildGenericApiUrl('api', `shop/v1/purchase/${this.state.assetId}?expectedPrice=${this.state.assetPrice}`))
.then(res => {
if(res.data.success)
{
this.props.setModal();
}
else if(res.data.userFacingMessage != null)
{
this.props.setModal(
{ res.data.userFacingMessage }
);
}
else
{
let oldPrice = this.state.assetPrice;
let newTokens = (this.state.userTokens - res.data.priceInTokens);
this.setState({assetPrice: res.data.priceInTokens, buttonDisabled: false});
this.props.setModal(
This item's price has changed from { oldPrice } to { res.data.priceInTokens }. {newTokens >= 0 ? 'Would you still like to purchase?' : null }
);
}
})
.catch(err => {
this.props.setModal(
An unexpected error occurred while purchasing this item.
);
});
}
render() {
return (
Purchase Item
Would you like to purchase the { this.state.assetType } { this.state.assetName } from { this.state.assetCreator } for { this.state.assetPrice }?
You will have { Math.max(0, (this.state.userTokens - this.state.assetPrice)) } after this purchase.
);
}
}
class PurchaseErrorModal extends Component {
constructor(props) {
super(props);
this.state = {
buttonDisabled: true
};
this.ModalRef = createRef();
this.Modal = null;
}
componentDidMount() {
this.Modal = new Bootstrap.Modal(this.ModalRef.current);
this.Modal.show();
this.ModalRef.current.addEventListener('hidden.bs.modal', (event) => {
this.props.setModal(null);
})
setTimeout(function(){
this.setState({buttonDisabled: false});
}.bind(this), 1000);
}
componentWillUnmount() {
this.Modal.dispose();
}
render() {
return (
Error Occurred
{ this.props.children }
{
this.props.purchaseAsset && this.props.newTokens >= 0 ?
<>
You will have { this.props.newTokens } after this purchase.
>
:
}
);
}
}
class PurchaseSuccessModal extends Component {
constructor(props) {
super(props);
this.state = {
};
this.ModalRef = createRef();
this.Modal = null;
}
componentDidMount() {
let itemElement = document.getElementById(itemId);
if(itemElement) {
this.setState({
assetName: itemElement.getAttribute('data-asset-name'),
assetPrice: parseInt(itemElement.getAttribute('data-asset-price'))
});
}
this.Modal = new Bootstrap.Modal(
this.ModalRef.current,
{
backdrop: 'static',
keyboard: false
}
);
this.Modal.show();
setTimeout(function(){
window.location.reload();
}, 2000);
}
componentWillUnmount() {
this.Modal.dispose();
}
render() {
return (
Purchase Successful
You have successfully purchased { this.state.assetName } for { this.state.assetPrice }!
);
}
}
class NotEnoughTokensModal extends Component {
constructor(props) {
super(props);
this.state = {
};
this.ModalRef = createRef();
this.Modal = null;
}
componentDidMount() {
let itemElement = document.getElementById(itemId);
if(itemElement) {
this.setState({
assetPrice: parseInt(itemElement.getAttribute('data-asset-price')),
userTokens: parseInt(itemElement.getAttribute('data-user-currency'))
});
}
this.Modal = new Bootstrap.Modal(this.ModalRef.current);
this.Modal.show();
this.ModalRef.current.addEventListener('hidden.bs.modal', (event) => {
this.props.setModal(null);
})
}
componentWillUnmount() {
this.Modal.dispose();
}
render() {
return (
Insufficient Funds
You need { this.state.assetPrice - this.state.userTokens } more to purchase this item.
);
}
}
class PurchaseButton extends Component {
constructor(props) {
super(props);
this.state = {
loaded: false,
showModal: false,
canPurchase: false
};
this.visibleModal = null;
this.showPrompt = this.showPrompt.bind(this);
this.setModal = this.setModal.bind(this);
}
componentDidMount() {
let itemElement = document.getElementById(itemId);
if(itemElement) {
this.setState({
assetOnSale: (itemElement.getAttribute('data-asset-on-sale') === '1'),
canAfford: (itemElement.getAttribute('data-can-afford') === '1'),
owned: (itemElement.getAttribute('data-owned') === '1')
}, function(){
let canPurchase = (!this.state.owned && this.state.assetOnSale);
this.setState({canPurchase: canPurchase});
});
}
this.setState({loaded: true});
}
showPrompt() {
if(this.state.canAfford)
this.setModal();
else
this.setModal();
}
setModal(modal = null) {
this.visibleModal = modal;
if(modal) {
this.setState({'showModal': true});
} else {
this.setState({'showModal': false});
}
}
render() {
return (
this.state.loaded
?
<>
{ this.state.showModal ? this.visibleModal : null }
>
:
);
}
}
export default PurchaseButton;