155 lines
5.5 KiB
TypeScript
155 lines
5.5 KiB
TypeScript
"use client";
|
|
import React, { useEffect, useState } from "react";
|
|
import { IResourceAccount, IConversionPair, IGameConfig } from "typings";
|
|
import { resourceToFc, resourceToBg } from "../../../utils/helpers";
|
|
import ResourceModal from "./ResourceModal";
|
|
|
|
const ResourceAccount = (props: {
|
|
account: IResourceAccount;
|
|
sellResource: (pairs: IConversionPair[]) => void;
|
|
gameConfig: IGameConfig | undefined;
|
|
}) => {
|
|
const [showModal, setShowModal] = useState(false);
|
|
const [conversionPair, setConversionPair] = useState<
|
|
IConversionPair | undefined
|
|
>(undefined);
|
|
const [conversionRate, setConversionRate] = useState<number>(0);
|
|
|
|
const handleConversionPair = (amount: number, resourceType: string) => {
|
|
const updatedPair = {
|
|
resourceType: resourceType,
|
|
resourceAmount: amount,
|
|
moneyAmount: amount / conversionRate,
|
|
};
|
|
setConversionPair(updatedPair);
|
|
};
|
|
|
|
const getConversionRate = (account: IResourceAccount) => {
|
|
if (props.gameConfig === undefined) return 0;
|
|
const query = account.resourceType + "ToMoonbucks";
|
|
const rate = props.gameConfig.gameConstants[query];
|
|
return rate;
|
|
};
|
|
|
|
const handleSellResource = () => {
|
|
conversionPair && props.sellResource([conversionPair]);
|
|
setShowModal(false);
|
|
};
|
|
|
|
useEffect(() => {
|
|
const rate = getConversionRate(props.account);
|
|
setConversionRate(rate);
|
|
}, [props.gameConfig]);
|
|
|
|
return (
|
|
<>
|
|
{showModal && (
|
|
<div className="z-10 fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center">
|
|
<div className="p-8 relative w-96">
|
|
<button
|
|
onClick={() => {
|
|
setShowModal(!showModal);
|
|
}}
|
|
className="text-white absolute top-0 hover:cursor-pointer"
|
|
>
|
|
<svg
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
fill="none"
|
|
viewBox="0 0 24 24"
|
|
strokeWidth={2}
|
|
stroke="currentColor"
|
|
className="w-6 h-6"
|
|
>
|
|
<path
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
d="M6 18L18 6M6 6l12 12"
|
|
/>
|
|
</svg>
|
|
</button>
|
|
<div className="md:h-auto max-w-md max-h-full overflow-y-auto">
|
|
<ResourceModal
|
|
resourceAccount={props.account}
|
|
conversionPair={conversionPair}
|
|
handleConversionPair={handleConversionPair}
|
|
/>
|
|
{
|
|
<div className="mt-2 bg-white rounded-lg p-3">
|
|
<p className="mb-0 text-2xl font-bold text-black">
|
|
Grand total
|
|
</p>
|
|
<p className="mb-2 text-2xl font-bold underline text-green-700">
|
|
${" "}
|
|
{conversionPair
|
|
? conversionPair.moneyAmount.toLocaleString("en-US", {
|
|
minimumFractionDigits: 2,
|
|
maximumFractionDigits: 2,
|
|
})
|
|
: 0}
|
|
</p>
|
|
{conversionPair && (
|
|
<button
|
|
onClick={() => handleSellResource()}
|
|
className="bg-green-700 py-2 text-slate-900 rounded-lg font-bold w-28 text-center text-white"
|
|
>
|
|
Sell Now
|
|
</button>
|
|
)}
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)}
|
|
<div className="flex-1 md:mb-0 mb-2 h-auto p-1 rounded-xl">
|
|
<div
|
|
className={
|
|
"bg-gradient-to-br hover:bg-gradient-to-tr " +
|
|
resourceToBg(props.account.resourceType) +
|
|
" relative text-white px-8 py-4 rounded-xl"
|
|
}
|
|
>
|
|
<span
|
|
className={resourceToFc(props.account.resourceType) + " font-bold"}
|
|
>
|
|
{props.account.resourceType}
|
|
</span>
|
|
<h3 className="text-2xl font-bold">
|
|
{props.account.balance.toLocaleString("en-US", {
|
|
minimumFractionDigits: 2,
|
|
maximumFractionDigits: 2,
|
|
})}{" "}
|
|
kg
|
|
</h3>
|
|
<div className="absolute right-0 top-0 mt-4 mr-4 hover:cursor-pointer">
|
|
<div
|
|
className="flex"
|
|
onClick={() => {
|
|
setShowModal(!showModal);
|
|
}}
|
|
>
|
|
<span className="mr-2">Sell</span>
|
|
<svg
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
fill="none"
|
|
viewBox="0 0 24 24"
|
|
strokeWidth={1.5}
|
|
stroke="currentColor"
|
|
className="w-6 h-6"
|
|
>
|
|
<path
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
d="M2.25 18.75a60.07 60.07 0 0115.797 2.101c.727.198 1.453-.342 1.453-1.096V18.75M3.75 4.5v.75A.75.75 0 013 6h-.75m0 0v-.375c0-.621.504-1.125 1.125-1.125H20.25M2.25 6v9m18-10.5v.75c0 .414.336.75.75.75h.75m-1.5-1.5h.375c.621 0 1.125.504 1.125 1.125v9.75c0 .621-.504 1.125-1.125 1.125h-.375m1.5-1.5H21a.75.75 0 00-.75.75v.75m0 0H3.75m0 0h-.375a1.125 1.125 0 01-1.125-1.125V15m1.5 1.5v-.75A.75.75 0 003 15h-.75M15 10.5a3 3 0 11-6 0 3 3 0 016 0zm3 0h.008v.008H18V10.5zm-12 0h.008v.008H6V10.5z"
|
|
/>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default ResourceAccount;
|