beeline-cli
Version:
A terminal wallet for the Hive blockchain - type, sign, rule the chain
135 lines • 7.4 kB
JavaScript
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AccountsScreen = AccountsScreen;
const react_1 = __importStar(require("react"));
const ink_1 = require("ink");
function AccountsScreen({ keyManager, setCurrentScreen }) {
const [accounts, setAccounts] = (0, react_1.useState)([]);
const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(0);
const [isLoading, setIsLoading] = (0, react_1.useState)(true);
const [message, setMessage] = (0, react_1.useState)(null);
(0, ink_1.useInput)((input, key) => {
if (key.upArrow && selectedIndex > 0) {
setSelectedIndex(selectedIndex - 1);
}
else if (key.downArrow && selectedIndex < accounts.length - 1) {
setSelectedIndex(selectedIndex + 1);
}
else if (key.return && accounts.length > 0) {
handleSelectAccount(accounts[selectedIndex].name);
}
else if (key.backspace || input === 'q') {
setCurrentScreen('dashboard');
}
else if (input === 's' && accounts.length > 0) {
handleSetDefault(accounts[selectedIndex].name);
}
});
(0, react_1.useEffect)(() => {
loadAccounts();
}, [keyManager]);
const loadAccounts = async () => {
try {
const accountList = await keyManager.listAccounts();
const defaultAccount = keyManager.getDefaultAccount();
const accountInfos = [];
for (const accountName of accountList) {
const keys = await keyManager.listKeys(accountName);
accountInfos.push({
name: accountName,
isDefault: accountName === defaultAccount,
hasKeys: keys.length > 0,
keyTypes: keys.map(k => k.role)
});
}
setAccounts(accountInfos);
setIsLoading(false);
}
catch (error) {
setMessage(`Error loading accounts: ${error instanceof Error ? error.message : 'Unknown error'}`);
setIsLoading(false);
}
};
const handleSelectAccount = (accountName) => {
setMessage(`Selected account: @${accountName}`);
// In a real implementation, this might switch to the account or show account details
};
const handleSetDefault = (accountName) => {
try {
keyManager.setDefaultAccount(accountName);
setMessage(`Set @${accountName} as default account`);
loadAccounts(); // Refresh to update default status
}
catch (error) {
setMessage(`Error setting default: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
};
if (isLoading) {
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingX: 2, paddingY: 1 },
react_1.default.createElement(ink_1.Text, { color: "cyan" }, "\u280B Loading accounts...")));
}
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingX: 2, paddingY: 1 },
react_1.default.createElement(ink_1.Box, { borderStyle: "single", borderColor: "yellow", paddingX: 1, marginBottom: 1 },
react_1.default.createElement(ink_1.Text, { color: "yellow", bold: true }, "\u2593 ACCOUNT MANAGEMENT \u2593")),
react_1.default.createElement(ink_1.Box, { borderStyle: "single", borderColor: "cyan", paddingX: 1, flexGrow: 1 },
react_1.default.createElement(ink_1.Box, { flexDirection: "column", flexGrow: 1 }, accounts.length === 0 ? (react_1.default.createElement(ink_1.Box, { flexDirection: "column", justifyContent: "center", alignItems: "center", flexGrow: 1 },
react_1.default.createElement(ink_1.Text, { color: "yellow" }, "\u26A0 No accounts found"),
react_1.default.createElement(ink_1.Text, { color: "gray" }, "Use 'beeline login <account>' to add an account"))) : (react_1.default.createElement(react_1.default.Fragment, null,
react_1.default.createElement(ink_1.Text, { color: "cyan", bold: true },
"Found ",
accounts.length,
" account",
accounts.length !== 1 ? 's' : ''),
accounts.map((account, index) => (react_1.default.createElement(ink_1.Box, { key: account.name, marginY: 0 },
react_1.default.createElement(ink_1.Text, { color: index === selectedIndex ? 'black' : 'white', backgroundColor: index === selectedIndex ? 'cyan' : undefined, bold: index === selectedIndex },
index === selectedIndex ? '► ' : ' ',
"@",
account.name,
account.isDefault && react_1.default.createElement(ink_1.Text, { color: "yellow" }, " \u2605 DEFAULT")),
index === selectedIndex && (react_1.default.createElement(ink_1.Box, { marginLeft: 4, flexDirection: "column" },
react_1.default.createElement(ink_1.Text, { color: "gray" },
"Keys: ",
account.hasKeys ? account.keyTypes.join(', ') : 'None')))))))))),
react_1.default.createElement(ink_1.Box, { borderStyle: "single", borderColor: "magenta", paddingX: 1, marginTop: 1 },
react_1.default.createElement(ink_1.Box, { flexDirection: "column", flexGrow: 1 },
react_1.default.createElement(ink_1.Text, { color: "magenta", bold: true }, "\u2593 CONTROLS \u2593"),
react_1.default.createElement(ink_1.Text, { color: "white" }, "\u2191\u2193: Navigate | Enter: Select | S: Set as Default | Q: Back to Dashboard"))),
message && (react_1.default.createElement(ink_1.Box, { borderStyle: "single", borderColor: "yellow", paddingX: 1, marginTop: 1 },
react_1.default.createElement(ink_1.Text, { color: "yellow" },
"\u25BA ",
message)))));
}
//# sourceMappingURL=AccountsScreen.js.map