/* 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;