From 5a975075808635dfa703982725b7fecf45741f6f Mon Sep 17 00:00:00 2001 From: jonty007 Date: Fri, 23 Aug 2024 16:42:51 +0530 Subject: [PATCH 1/2] Added BalanceContext --- packages/components/built/BalanceContext.d.ts | 15 ++++++ packages/components/built/BalanceContext.js | 30 ++++++++++++ packages/components/built/Wallet.js | 9 ++-- packages/components/built/index.d.ts | 1 + packages/components/built/index.js | 1 + packages/components/src/BalanceContext.tsx | 33 +++++++++++++ packages/components/src/Wallet.tsx | 48 ++++++++++++------- packages/components/src/index.tsx | 1 + packages/explorer/src/App.tsx | 35 +++++++------- packages/nft/src/App.tsx | 33 +++++++------ packages/wallet/src/App.tsx | 41 +++++++++------- packages/wallet/src/components/Send.tsx | 4 +- packages/wallet/src/components/Sidebar.tsx | 26 ++++++---- 13 files changed, 199 insertions(+), 78 deletions(-) create mode 100644 packages/components/built/BalanceContext.d.ts create mode 100644 packages/components/built/BalanceContext.js create mode 100644 packages/components/src/BalanceContext.tsx diff --git a/packages/components/built/BalanceContext.d.ts b/packages/components/built/BalanceContext.d.ts new file mode 100644 index 000000000..a6c9d81ef --- /dev/null +++ b/packages/components/built/BalanceContext.d.ts @@ -0,0 +1,15 @@ +import React, { ReactNode } from "react"; +interface BalanceContextProps { + setBalance: (amount: number) => void; + balance: number; +} +interface BalanceProviderProps { + children: ReactNode; +} +export declare const BalanceProvider: React.FC; +export declare const useBalance: () => BalanceContextProps; +export declare const BalanceContext: { + BalanceProvider: React.FC; + useBalance: () => BalanceContextProps; +}; +export {}; diff --git a/packages/components/built/BalanceContext.js b/packages/components/built/BalanceContext.js new file mode 100644 index 000000000..f9b2194bb --- /dev/null +++ b/packages/components/built/BalanceContext.js @@ -0,0 +1,30 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +import { jsx as _jsx } from "react/jsx-runtime"; +import { createContext, useState, useContext } from "react"; +var balanceContext = createContext(undefined); +export var BalanceProvider = function (_a) { + var children = _a.children; + var _b = useState(0), balance = _b[0], setBalance = _b[1]; + return (_jsx(balanceContext.Provider, __assign({ value: { balance: balance, setBalance: setBalance } }, { children: children }))); +}; +export var useBalance = function () { + var context = useContext(balanceContext); + if (!context) { + throw new Error("useBalance must be used within a BalanceProvider"); + } + return context; +}; +export var BalanceContext = { + BalanceProvider: BalanceProvider, + useBalance: useBalance +}; diff --git a/packages/components/built/Wallet.js b/packages/components/built/Wallet.js index 4da660a93..27c51bdf1 100644 --- a/packages/components/built/Wallet.js +++ b/packages/components/built/Wallet.js @@ -52,9 +52,10 @@ import { Auth } from "./Auth"; import { Drawer } from "./Drawer"; import { UtilsContext } from "./UtilsContext"; import { ComputerContext } from "./ComputerContext"; +import { BalanceContext } from "./BalanceContext"; var Balance = function (_a) { var computer = _a.computer, paymentModSpec = _a.paymentModSpec; - var _b = useState(0), balance = _b[0], setBalance = _b[1]; + var _b = BalanceContext.useBalance(), balance = _b.balance, setBalance = _b.setBalance; var _c = useState(localStorage.getItem("CHAIN") || "LTC"), setChain = _c[1]; var _d = UtilsContext.useUtilsComponents(), showSnackBar = _d.showSnackBar, showLoader = _d.showLoader; var refreshBalance = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () { @@ -119,7 +120,7 @@ var Balance = function (_a) { useEffect(function () { refreshBalance(); }, []); - return (_jsxs("div", __assign({ id: "dropdown-cta", className: "relative flex flex-col p-6 my-4 rounded-lg bg-blue-50 dark:bg-blue-900", role: "alert" }, { children: [_jsxs("div", __assign({ className: "text-center mb-1 text-2xl font-bold text-blue-800 dark:text-blue-400" }, { children: [balance / 1e8, " ", computer.getChain(), " ", _jsx(HiRefresh, { onClick: refreshBalance, className: "w-4 h-4 ml-1 mb-1 inline cursor-pointer hover:text-slate-700 dark:hover:text-slate-100" })] })), _jsx("div", __assign({ className: "text-center uppercase text-xs text-blue-800 dark:text-blue-400" }, { children: computer.getNetwork() })), computer.getNetwork() === 'regtest' && _jsx("button", __assign({ type: "button", onClick: fund, className: "absolute bottom-2 right-2 px-1 py-1 text-center text-xs font-medium text-center text-blue-700 hover:text-white border border-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg dark:border-blue-500 dark:text-blue-500 dark:hover:text-white dark:hover:bg-blue-500 dark:focus:ring-blue-800" }, { children: "Fund" }))] }))); + return (_jsxs("div", __assign({ id: "dropdown-cta", className: "relative flex flex-col p-6 my-4 rounded-lg bg-blue-50 dark:bg-blue-900", role: "alert" }, { children: [_jsxs("div", __assign({ className: "text-center mb-1 text-2xl font-bold text-blue-800 dark:text-blue-400" }, { children: [balance / 1e8, " ", computer.getChain(), " ", _jsx(HiRefresh, { onClick: refreshBalance, className: "w-4 h-4 ml-1 mb-1 inline cursor-pointer hover:text-slate-700 dark:hover:text-slate-100" })] })), _jsx("div", __assign({ className: "text-center uppercase text-xs text-blue-800 dark:text-blue-400" }, { children: computer.getNetwork() })), computer.getNetwork() === "regtest" && (_jsx("button", __assign({ type: "button", onClick: fund, className: "absolute bottom-2 right-2 px-1 py-1 text-center text-xs font-medium text-center text-blue-700 hover:text-white border border-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg dark:border-blue-500 dark:text-blue-500 dark:hover:text-white dark:hover:bg-blue-500 dark:focus:ring-blue-800" }, { children: "Fund" })))] }))); }; var Address = function (_a) { var computer = _a.computer; @@ -132,7 +133,7 @@ var PublicKey = function (_a) { var Mnemonic = function (_a) { var computer = _a.computer; var _b = useState(false), mnemonicShown = _b[0], setMnemonicShown = _b[1]; - return _jsxs("div", __assign({ className: "mb-4" }, { children: [_jsxs("h6", __assign({ className: "text-lg font-bold dark:text-white" }, { children: ["Mnemonic\u00A0", _jsx("button", __assign({ onClick: function () { return setMnemonicShown(!mnemonicShown); }, className: "text-xs font-mono font-normal text-gray-500 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-500 underline" }, { children: mnemonicShown ? 'hide' : 'show' }))] })), _jsx("p", __assign({ className: "text-xs font-mono text-gray-500 dark:text-gray-400 break-words" }, { children: mnemonicShown ? computer.getMnemonic() : '' }))] })); + return (_jsxs("div", __assign({ className: "mb-4" }, { children: [_jsxs("h6", __assign({ className: "text-lg font-bold dark:text-white" }, { children: ["Mnemonic\u00A0", _jsx("button", __assign({ onClick: function () { return setMnemonicShown(!mnemonicShown); }, className: "text-xs font-mono font-normal text-gray-500 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-500 underline" }, { children: mnemonicShown ? "hide" : "show" }))] })), _jsx("p", __assign({ className: "text-xs font-mono text-gray-500 dark:text-gray-400 break-words" }, { children: mnemonicShown ? computer.getMnemonic() : "" }))] }))); }; var Url = function (_a) { var computer = _a.computer; @@ -150,7 +151,7 @@ var LogOut = function () { return (_jsxs(_Fragment, { children: [_jsxs("div", __ export function Wallet(_a) { var paymentModSpec = _a.paymentModSpec; var computer = useContext(ComputerContext); - var Content = function () { return (_jsxs(_Fragment, { children: [_jsx("h4", __assign({ className: "text-2xl font-bold dark:text-white" }, { children: "Wallet" })), _jsx(Balance, { computer: computer, paymentModSpec: paymentModSpec }), _jsx(Address, { computer: computer }), _jsx(PublicKey, { computer: computer }), _jsx(Mnemonic, { computer: computer }), !process.env['REACT_APP_CHAIN'] && _jsx(Chain, { computer: computer }), !process.env['REACT_APP_NETWORK'] && _jsx(Network, { computer: computer }), !process.env['REACT_APP_URL'] && _jsx(Url, { computer: computer }), _jsx("hr", { className: "h-px my-6 bg-gray-200 border-0 dark:bg-gray-700" }), _jsx(LogOut, {})] })); }; + var Content = function () { return (_jsxs(_Fragment, { children: [_jsx("h4", __assign({ className: "text-2xl font-bold dark:text-white" }, { children: "Wallet" })), _jsx(Balance, { computer: computer, paymentModSpec: paymentModSpec }), _jsx(Address, { computer: computer }), _jsx(PublicKey, { computer: computer }), _jsx(Mnemonic, { computer: computer }), !process.env["REACT_APP_CHAIN"] && _jsx(Chain, { computer: computer }), !process.env["REACT_APP_NETWORK"] && _jsx(Network, { computer: computer }), !process.env["REACT_APP_URL"] && _jsx(Url, { computer: computer }), _jsx("hr", { className: "h-px my-6 bg-gray-200 border-0 dark:bg-gray-700" }), _jsx(LogOut, {})] })); }; return _jsx(Drawer.Component, { Content: Content, id: "wallet-drawer" }); } export var WalletComponents = { diff --git a/packages/components/built/index.d.ts b/packages/components/built/index.d.ts index 71413b91f..f21bd884a 100644 --- a/packages/components/built/index.d.ts +++ b/packages/components/built/index.d.ts @@ -12,3 +12,4 @@ export { Drawer } from "./Drawer"; export { Wallet, WalletComponents } from "./Wallet"; export { Card } from "./Card"; export * from "./common/utils"; +export { BalanceContext } from "./BalanceContext"; diff --git a/packages/components/built/index.js b/packages/components/built/index.js index 71413b91f..f21bd884a 100644 --- a/packages/components/built/index.js +++ b/packages/components/built/index.js @@ -12,3 +12,4 @@ export { Drawer } from "./Drawer"; export { Wallet, WalletComponents } from "./Wallet"; export { Card } from "./Card"; export * from "./common/utils"; +export { BalanceContext } from "./BalanceContext"; diff --git a/packages/components/src/BalanceContext.tsx b/packages/components/src/BalanceContext.tsx new file mode 100644 index 000000000..b2ebdc811 --- /dev/null +++ b/packages/components/src/BalanceContext.tsx @@ -0,0 +1,33 @@ +import React, { createContext, useState, useContext, ReactNode } from "react" + +interface BalanceContextProps { + setBalance: (amount: number) => void + balance: number +} + +const balanceContext = createContext(undefined) + +interface BalanceProviderProps { + children: ReactNode +} + +export const BalanceProvider: React.FC = ({ children }) => { + const [balance, setBalance] = useState(0) + + return ( + {children} + ) +} + +export const useBalance = (): BalanceContextProps => { + const context = useContext(balanceContext) + if (!context) { + throw new Error("useBalance must be used within a BalanceProvider") + } + return context +} + +export const BalanceContext = { + BalanceProvider, + useBalance +} diff --git a/packages/components/src/Wallet.tsx b/packages/components/src/Wallet.tsx index d448dab25..c0a466a18 100644 --- a/packages/components/src/Wallet.tsx +++ b/packages/components/src/Wallet.tsx @@ -5,6 +5,7 @@ import { Auth } from "./Auth" import { Drawer } from "./Drawer" import { UtilsContext } from "./UtilsContext" import { ComputerContext } from "./ComputerContext" +import { BalanceContext } from "./BalanceContext" const Balance = ({ computer, @@ -13,7 +14,7 @@ const Balance = ({ computer: Computer paymentModSpec: string | undefined }) => { - const [balance, setBalance] = useState(0) + const { balance, setBalance } = BalanceContext.useBalance() const [, setChain] = useState(localStorage.getItem("CHAIN") || "LTC") const { showSnackBar, showLoader } = UtilsContext.useUtilsComponents() @@ -24,10 +25,13 @@ const Balance = ({ const publicKey = computer.getPublicKey() const mod = paymentModSpec const paymentRevs = paymentModSpec ? await computer.query({ publicKey, mod }) : [] - const payments = (await Promise.all(paymentRevs.map((rev: string) => computer.sync(rev)))) as any[] - const amountsInPaymentToken = payments && payments.length - ? payments.reduce((total, pay) => total + (pay._amount - computer.getMinimumFees()), 0) - : 0 + const payments = (await Promise.all( + paymentRevs.map((rev: string) => computer.sync(rev)) + )) as any[] + const amountsInPaymentToken = + payments && payments.length + ? payments.reduce((total, pay) => total + (pay._amount - computer.getMinimumFees()), 0) + : 0 const availableWalletBalance = await computer.getBalance() setBalance(availableWalletBalance.balance + amountsInPaymentToken) @@ -50,20 +54,30 @@ const Balance = ({ }, []) return ( -