2023-04-24 15:09:08 +07:00

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;