@shieldedtech/moth-tui 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -0
- package/dist/app.d.ts +7 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +474 -0
- package/dist/app.js.map +1 -0
- package/dist/components/BackHint.d.ts +5 -0
- package/dist/components/BackHint.d.ts.map +1 -0
- package/dist/components/BackHint.js +6 -0
- package/dist/components/BackHint.js.map +1 -0
- package/dist/components/BalanceTable.d.ts +9 -0
- package/dist/components/BalanceTable.d.ts.map +1 -0
- package/dist/components/BalanceTable.js +8 -0
- package/dist/components/BalanceTable.js.map +1 -0
- package/dist/components/ConfirmationModal.d.ts +8 -0
- package/dist/components/ConfirmationModal.d.ts.map +1 -0
- package/dist/components/ConfirmationModal.js +33 -0
- package/dist/components/ConfirmationModal.js.map +1 -0
- package/dist/components/HelpFooter.d.ts +16 -0
- package/dist/components/HelpFooter.d.ts.map +1 -0
- package/dist/components/HelpFooter.js +7 -0
- package/dist/components/HelpFooter.js.map +1 -0
- package/dist/components/Loader.d.ts +5 -0
- package/dist/components/Loader.d.ts.map +1 -0
- package/dist/components/Loader.js +7 -0
- package/dist/components/Loader.js.map +1 -0
- package/dist/components/SectionHeader.d.ts +19 -0
- package/dist/components/SectionHeader.d.ts.map +1 -0
- package/dist/components/SectionHeader.js +11 -0
- package/dist/components/SectionHeader.js.map +1 -0
- package/dist/components/Select.d.ts +35 -0
- package/dist/components/Select.d.ts.map +1 -0
- package/dist/components/Select.js +49 -0
- package/dist/components/Select.js.map +1 -0
- package/dist/components/TxStatus.d.ts +8 -0
- package/dist/components/TxStatus.d.ts.map +1 -0
- package/dist/components/TxStatus.js +22 -0
- package/dist/components/TxStatus.js.map +1 -0
- package/dist/hooks/useBalance.d.ts +19 -0
- package/dist/hooks/useBalance.d.ts.map +1 -0
- package/dist/hooks/useBalance.js +119 -0
- package/dist/hooks/useBalance.js.map +1 -0
- package/dist/hooks/useChainStatus.d.ts +13 -0
- package/dist/hooks/useChainStatus.d.ts.map +1 -0
- package/dist/hooks/useChainStatus.js +97 -0
- package/dist/hooks/useChainStatus.js.map +1 -0
- package/dist/hooks/useDaemonHost.d.ts +30 -0
- package/dist/hooks/useDaemonHost.d.ts.map +1 -0
- package/dist/hooks/useDaemonHost.js +122 -0
- package/dist/hooks/useDaemonHost.js.map +1 -0
- package/dist/hooks/useLogs.d.ts +11 -0
- package/dist/hooks/useLogs.d.ts.map +1 -0
- package/dist/hooks/useLogs.js +44 -0
- package/dist/hooks/useLogs.js.map +1 -0
- package/dist/hooks/useNetwork.d.ts +14 -0
- package/dist/hooks/useNetwork.d.ts.map +1 -0
- package/dist/hooks/useNetwork.js +100 -0
- package/dist/hooks/useNetwork.js.map +1 -0
- package/dist/hooks/useWallet.d.ts +29 -0
- package/dist/hooks/useWallet.d.ts.map +1 -0
- package/dist/hooks/useWallet.js +135 -0
- package/dist/hooks/useWallet.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/navigation/index.d.ts +3 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +2 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/navigation/types.d.ts +84 -0
- package/dist/navigation/types.d.ts.map +1 -0
- package/dist/navigation/types.js +3 -0
- package/dist/navigation/types.js.map +1 -0
- package/dist/navigation/useStackNavigator.d.ts +3 -0
- package/dist/navigation/useStackNavigator.d.ts.map +1 -0
- package/dist/navigation/useStackNavigator.js +20 -0
- package/dist/navigation/useStackNavigator.js.map +1 -0
- package/dist/persistent-log.d.ts +5 -0
- package/dist/persistent-log.d.ts.map +1 -0
- package/dist/persistent-log.js +55 -0
- package/dist/persistent-log.js.map +1 -0
- package/dist/screens/contract.d.ts +8 -0
- package/dist/screens/contract.d.ts.map +1 -0
- package/dist/screens/contract.js +104 -0
- package/dist/screens/contract.js.map +1 -0
- package/dist/screens/dashboard/DashboardHub.d.ts +35 -0
- package/dist/screens/dashboard/DashboardHub.d.ts.map +1 -0
- package/dist/screens/dashboard/DashboardHub.js +67 -0
- package/dist/screens/dashboard/DashboardHub.js.map +1 -0
- package/dist/screens/dashboard/StateView.d.ts +24 -0
- package/dist/screens/dashboard/StateView.d.ts.map +1 -0
- package/dist/screens/dashboard/StateView.js +79 -0
- package/dist/screens/dashboard/StateView.js.map +1 -0
- package/dist/screens/dashboard/index.d.ts +3 -0
- package/dist/screens/dashboard/index.d.ts.map +1 -0
- package/dist/screens/dashboard/index.js +3 -0
- package/dist/screens/dashboard/index.js.map +1 -0
- package/dist/screens/deploy.d.ts +8 -0
- package/dist/screens/deploy.d.ts.map +1 -0
- package/dist/screens/deploy.js +125 -0
- package/dist/screens/deploy.js.map +1 -0
- package/dist/screens/dust.d.ts +21 -0
- package/dist/screens/dust.d.ts.map +1 -0
- package/dist/screens/dust.js +289 -0
- package/dist/screens/dust.js.map +1 -0
- package/dist/screens/keys.d.ts +21 -0
- package/dist/screens/keys.d.ts.map +1 -0
- package/dist/screens/keys.js +126 -0
- package/dist/screens/keys.js.map +1 -0
- package/dist/screens/logs.d.ts +10 -0
- package/dist/screens/logs.d.ts.map +1 -0
- package/dist/screens/logs.js +62 -0
- package/dist/screens/logs.js.map +1 -0
- package/dist/screens/mint.d.ts +13 -0
- package/dist/screens/mint.d.ts.map +1 -0
- package/dist/screens/mint.js +151 -0
- package/dist/screens/mint.js.map +1 -0
- package/dist/screens/network.d.ts +12 -0
- package/dist/screens/network.d.ts.map +1 -0
- package/dist/screens/network.js +117 -0
- package/dist/screens/network.js.map +1 -0
- package/dist/screens/onboarding/InitializingScreen.d.ts +10 -0
- package/dist/screens/onboarding/InitializingScreen.d.ts.map +1 -0
- package/dist/screens/onboarding/InitializingScreen.js +7 -0
- package/dist/screens/onboarding/InitializingScreen.js.map +1 -0
- package/dist/screens/onboarding/MnemonicDisplayScreen.d.ts +9 -0
- package/dist/screens/onboarding/MnemonicDisplayScreen.d.ts.map +1 -0
- package/dist/screens/onboarding/MnemonicDisplayScreen.js +23 -0
- package/dist/screens/onboarding/MnemonicDisplayScreen.js.map +1 -0
- package/dist/screens/onboarding/NameScreen.d.ts +9 -0
- package/dist/screens/onboarding/NameScreen.d.ts.map +1 -0
- package/dist/screens/onboarding/NameScreen.js +32 -0
- package/dist/screens/onboarding/NameScreen.js.map +1 -0
- package/dist/screens/onboarding/NetworkSelectScreen.d.ts +9 -0
- package/dist/screens/onboarding/NetworkSelectScreen.d.ts.map +1 -0
- package/dist/screens/onboarding/NetworkSelectScreen.js +20 -0
- package/dist/screens/onboarding/NetworkSelectScreen.js.map +1 -0
- package/dist/screens/onboarding/OnboardingHost.d.ts +15 -0
- package/dist/screens/onboarding/OnboardingHost.d.ts.map +1 -0
- package/dist/screens/onboarding/OnboardingHost.js +42 -0
- package/dist/screens/onboarding/OnboardingHost.js.map +1 -0
- package/dist/screens/onboarding/PassphraseScreen.d.ts +9 -0
- package/dist/screens/onboarding/PassphraseScreen.d.ts.map +1 -0
- package/dist/screens/onboarding/PassphraseScreen.js +46 -0
- package/dist/screens/onboarding/PassphraseScreen.js.map +1 -0
- package/dist/screens/onboarding/SeedEntryScreen.d.ts +9 -0
- package/dist/screens/onboarding/SeedEntryScreen.d.ts.map +1 -0
- package/dist/screens/onboarding/SeedEntryScreen.js +49 -0
- package/dist/screens/onboarding/SeedEntryScreen.js.map +1 -0
- package/dist/screens/onboarding/SeedSourceScreen.d.ts +9 -0
- package/dist/screens/onboarding/SeedSourceScreen.d.ts.map +1 -0
- package/dist/screens/onboarding/SeedSourceScreen.js +22 -0
- package/dist/screens/onboarding/SeedSourceScreen.js.map +1 -0
- package/dist/screens/onboarding/UnlockScreen.d.ts +9 -0
- package/dist/screens/onboarding/UnlockScreen.d.ts.map +1 -0
- package/dist/screens/onboarding/UnlockScreen.js +29 -0
- package/dist/screens/onboarding/UnlockScreen.js.map +1 -0
- package/dist/screens/onboarding/WalletSelectScreen.d.ts +9 -0
- package/dist/screens/onboarding/WalletSelectScreen.d.ts.map +1 -0
- package/dist/screens/onboarding/WalletSelectScreen.js +30 -0
- package/dist/screens/onboarding/WalletSelectScreen.js.map +1 -0
- package/dist/screens/onboarding/index.d.ts +2 -0
- package/dist/screens/onboarding/index.d.ts.map +1 -0
- package/dist/screens/onboarding/index.js +2 -0
- package/dist/screens/onboarding/index.js.map +1 -0
- package/dist/screens/send.d.ts +12 -0
- package/dist/screens/send.d.ts.map +1 -0
- package/dist/screens/send.js +187 -0
- package/dist/screens/send.js.map +1 -0
- package/dist/settings.d.ts +16 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +23 -0
- package/dist/settings.js.map +1 -0
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/balance.d.ts +48 -0
- package/dist/utils/balance.d.ts.map +1 -0
- package/dist/utils/balance.js +61 -0
- package/dist/utils/balance.js.map +1 -0
- package/dist/utils/display.d.ts +3 -0
- package/dist/utils/display.d.ts.map +1 -0
- package/dist/utils/display.js +17 -0
- package/dist/utils/display.js.map +1 -0
- package/dist/utils/sync.d.ts +7 -0
- package/dist/utils/sync.d.ts.map +1 -0
- package/dist/utils/sync.js +11 -0
- package/dist/utils/sync.js.map +1 -0
- package/dist/utils/synced-wallet-stub.d.ts +3 -0
- package/dist/utils/synced-wallet-stub.d.ts.map +1 -0
- package/dist/utils/synced-wallet-stub.js +35 -0
- package/dist/utils/synced-wallet-stub.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BalanceTable.js","sourceRoot":"","sources":["../../src/components/BalanceTable.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAQhC,MAAM,UAAU,YAAY,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAqB;IACnF,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE9C,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,IAAI,kBAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EACtC,KAAC,IAAI,IAAC,IAAI,kBAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EACxC,KAAC,IAAI,IAAC,IAAI,2BAAY,IAClB,EACN,MAAC,GAAG,eACF,KAAC,IAAI,cAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EACjC,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,YAAE,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EAC9D,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,YAAG,aAAa,GAAQ,IAC1C,EACN,MAAC,GAAG,eACF,KAAC,IAAI,cAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EAChC,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,YAAE,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EAC9D,KAAC,IAAI,IAAC,KAAK,EAAE,SAAS,YAAG,aAAa,GAAQ,IAC1C,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ConfirmationQueue } from '@shieldedtech/moth-wallet';
|
|
3
|
+
interface Props {
|
|
4
|
+
queue: ConfirmationQueue;
|
|
5
|
+
}
|
|
6
|
+
export declare function ConfirmationModal({ queue }: Props): React.ReactElement | null;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=ConfirmationModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmationModal.d.ts","sourceRoot":"","sources":["../../src/components/ConfirmationModal.tsx"],"names":[],"mappings":"AAUA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,OAAO,KAAK,EAAC,iBAAiB,EAAsB,MAAM,2BAA2B,CAAC;AAEtF,UAAU,KAAK;IACb,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,EAAC,KAAK,EAAC,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAmD3E"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// Modal overlay that interrupts the current TUI screen when an
|
|
3
|
+
// external CLI client requests approval for a write operation through
|
|
4
|
+
// the daemon socket. Subscribes to the confirmation queue and renders
|
|
5
|
+
// the head entry until the user answers y/n.
|
|
6
|
+
//
|
|
7
|
+
// Lives at the top of <App/> so it can capture input even when the
|
|
8
|
+
// active screen is doing the same — Ink's useInput obeys isActive, so
|
|
9
|
+
// the modal grabs keystrokes while it is mounted and the underlying
|
|
10
|
+
// screen's input handlers stay quiet.
|
|
11
|
+
import { useEffect, useState } from 'react';
|
|
12
|
+
import { Box, Text, useInput } from 'ink';
|
|
13
|
+
export function ConfirmationModal({ queue }) {
|
|
14
|
+
const [current, setCurrent] = useState(queue.peek());
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
const sync = () => setCurrent(queue.peek());
|
|
17
|
+
sync();
|
|
18
|
+
return queue.subscribe(sync);
|
|
19
|
+
}, [queue]);
|
|
20
|
+
useInput((input) => {
|
|
21
|
+
if (!current)
|
|
22
|
+
return;
|
|
23
|
+
const key = input.toLowerCase();
|
|
24
|
+
if (key === 'y')
|
|
25
|
+
queue.resolve(true);
|
|
26
|
+
else if (key === 'n')
|
|
27
|
+
queue.resolve(false);
|
|
28
|
+
}, { isActive: current !== null });
|
|
29
|
+
if (!current)
|
|
30
|
+
return null;
|
|
31
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "double", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: "External request from CLI" }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: current.summary }) }), current.details && current.details.length > 0 && (_jsx(Box, { flexDirection: "column", marginTop: 1, children: current.details.map((d, i) => (_jsxs(Text, { dimColor: true, children: ["\u00B7 ", d] }, i))) })), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { children: ["Approve? ", _jsx(Text, { bold: true, children: "[y]" }), "es / ", _jsx(Text, { bold: true, children: "[n]" }), "o"] }) })] }));
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=ConfirmationModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfirmationModal.js","sourceRoot":"","sources":["../../src/components/ConfirmationModal.tsx"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,sEAAsE;AACtE,sEAAsE;AACtE,6CAA6C;AAC7C,EAAE;AACF,mEAAmE;AACnE,sEAAsE;AACtE,oEAAoE;AACpE,sCAAsC;AAEtC,OAAc,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AACjD,OAAO,EAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAC,MAAM,KAAK,CAAC;AAOxC,MAAM,UAAU,iBAAiB,CAAC,EAAC,KAAK,EAAQ;IAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAA6B,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAEjF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,CAAC;QACP,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,QAAQ,CACN,CAAC,KAAK,EAAE,EAAE;QACR,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAChC,IAAI,GAAG,KAAK,GAAG;YAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAChC,IAAI,GAAG,KAAK,GAAG;YAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,EACD,EAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,EAAC,CAC7B,CAAC;IAEF,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO,CACL,MAAC,GAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,QAAQ,EACpB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,aAEX,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,0CAElB,EACP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,cAAE,OAAO,CAAC,OAAO,GAAQ,GAC1B,EACL,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAChD,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,YACrC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC7B,MAAC,IAAI,IAAS,QAAQ,8BACjB,CAAC,KADK,CAAC,CAEL,CACR,CAAC,GACE,CACP,EACD,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,4BACM,KAAC,IAAI,IAAC,IAAI,0BAAW,WAAK,KAAC,IAAI,IAAC,IAAI,0BAAW,SACnD,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface HelpHint {
|
|
3
|
+
key: string;
|
|
4
|
+
label: string;
|
|
5
|
+
/** Optional badge text rendered after the label (e.g. unread count). */
|
|
6
|
+
badge?: string;
|
|
7
|
+
badgeColor?: string;
|
|
8
|
+
}
|
|
9
|
+
interface Props {
|
|
10
|
+
hints: HelpHint[];
|
|
11
|
+
/** Top spacing. Defaults to 1 (matches DashboardHub style). */
|
|
12
|
+
paddingTop?: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function HelpFooter({ hints, paddingTop }: Props): React.JSX.Element;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=HelpFooter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HelpFooter.d.ts","sourceRoot":"","sources":["../../src/components/HelpFooter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,KAAK;IACb,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,UAAc,EAAE,EAAE,KAAK,qBAiB1D"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
export function HelpFooter({ hints, paddingTop = 1 }) {
|
|
5
|
+
return (_jsx(Box, { paddingTop: paddingTop, flexWrap: "wrap", children: _jsx(Text, { dimColor: true, children: hints.map((h, i) => (_jsxs(React.Fragment, { children: [i > 0 && _jsx(Text, { dimColor: true, children: " \u00B7 " }), _jsx(Text, { bold: true, color: "cyan", children: h.key }), _jsxs(Text, { children: [' ', h.label] }), h.badge && (_jsxs(Text, { color: h.badgeColor ?? 'yellow', children: [" (", h.badge, ")"] }))] }, `${h.key}-${i}`))) }) }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=HelpFooter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HelpFooter.js","sourceRoot":"","sources":["../../src/components/HelpFooter.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAgBhC,MAAM,UAAU,UAAU,CAAC,EAAE,KAAK,EAAE,UAAU,GAAG,CAAC,EAAS;IACzD,OAAO,CACL,KAAC,GAAG,IAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAC,MAAM,YAC1C,KAAC,IAAI,IAAC,QAAQ,kBACX,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACnB,MAAC,KAAK,CAAC,QAAQ,eACZ,CAAC,GAAG,CAAC,IAAI,KAAC,IAAI,IAAC,QAAQ,+BAAW,EACnC,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,YAAE,CAAC,CAAC,GAAG,GAAQ,EACtC,MAAC,IAAI,eAAE,GAAG,EAAE,CAAC,CAAC,KAAK,IAAQ,EAC1B,CAAC,CAAC,KAAK,IAAI,CACV,MAAC,IAAI,IAAC,KAAK,EAAE,CAAC,CAAC,UAAU,IAAI,QAAQ,mBAAK,CAAC,CAAC,KAAK,SAAS,CAC3D,KANkB,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAOnB,CAClB,CAAC,GACG,GACH,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Loader.d.ts","sourceRoot":"","sources":["../../src/components/Loader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,qBAShD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import Spinner from 'ink-spinner';
|
|
4
|
+
export function Loader({ text }) {
|
|
5
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) }), _jsxs(Text, { children: [" ", text] })] }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=Loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Loader.js","sourceRoot":"","sources":["../../src/components/Loader.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,OAAO,MAAM,aAAa,CAAC;AAElC,MAAM,UAAU,MAAM,CAAC,EAAE,IAAI,EAAoB;IAC/C,OAAO,CACL,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAChB,KAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,GAClB,EACP,MAAC,IAAI,oBAAG,IAAI,IAAQ,IAChB,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface Chip {
|
|
3
|
+
label: string;
|
|
4
|
+
color?: string;
|
|
5
|
+
}
|
|
6
|
+
interface Props {
|
|
7
|
+
title: string;
|
|
8
|
+
/** Optional sub-text shown dimmed after the title (breadcrumb / hint). */
|
|
9
|
+
hint?: string;
|
|
10
|
+
/** Optional colored badges shown after the hint (e.g. PAUSED). */
|
|
11
|
+
chips?: Chip[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Round-gray bordered title strip used at the top of every screen and view.
|
|
15
|
+
* Mirrors midnight-wallet-cli's section heading pattern.
|
|
16
|
+
*/
|
|
17
|
+
export declare function SectionHeader({ title, hint, chips }: Props): React.JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=SectionHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionHeader.d.ts","sourceRoot":"","sources":["../../src/components/SectionHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,IAAI;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,qBAkB1D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
/**
|
|
5
|
+
* Round-gray bordered title strip used at the top of every screen and view.
|
|
6
|
+
* Mirrors midnight-wallet-cli's section heading pattern.
|
|
7
|
+
*/
|
|
8
|
+
export function SectionHeader({ title, hint, chips }) {
|
|
9
|
+
return (_jsxs(Box, { borderStyle: "round", borderColor: "gray", paddingX: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, children: title }), hint && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: " \u00B7 " }), _jsx(Text, { dimColor: true, children: hint })] })), chips?.map((chip, i) => (_jsxs(React.Fragment, { children: [_jsx(Text, { dimColor: true, children: " \u00B7 " }), _jsx(Text, { bold: true, color: chip.color ?? 'yellow', children: chip.label })] }, i)))] }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=SectionHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionHeader.js","sourceRoot":"","sources":["../../src/components/SectionHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAehC;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAS;IACzD,OAAO,CACL,MAAC,GAAG,IAAC,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,aACtE,KAAC,IAAI,IAAC,IAAI,kBAAE,KAAK,GAAQ,EACxB,IAAI,IAAI,CACP,8BACE,KAAC,IAAI,IAAC,QAAQ,+BAAW,EACzB,KAAC,IAAI,IAAC,QAAQ,kBAAE,IAAI,GAAQ,IAC3B,CACJ,EACA,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACvB,MAAC,KAAK,CAAC,QAAQ,eACb,KAAC,IAAI,IAAC,QAAQ,+BAAW,EACzB,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,QAAQ,YAAG,IAAI,CAAC,KAAK,GAAQ,KAF1C,CAAC,CAGL,CAClB,CAAC,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface SelectItem<T> {
|
|
3
|
+
label: string;
|
|
4
|
+
value: T;
|
|
5
|
+
/** Optional secondary text shown dimmed to the right of the label. */
|
|
6
|
+
hint?: string;
|
|
7
|
+
}
|
|
8
|
+
interface SelectProps<T> {
|
|
9
|
+
items: SelectItem<T>[];
|
|
10
|
+
onSelect: (value: T) => void;
|
|
11
|
+
initialIndex?: number;
|
|
12
|
+
isActive?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Max items to render at once. Defaults to a value derived from the terminal
|
|
15
|
+
* height so the list never overflows the screen (which corrupts Ink's redraw).
|
|
16
|
+
*/
|
|
17
|
+
maxVisible?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Arrow-key driven select. Up/Down to move, Enter to confirm.
|
|
21
|
+
*
|
|
22
|
+
* Each item renders on a SINGLE line — `label` followed by a dimmed `hint` —
|
|
23
|
+
* mirroring the Wallet Keys screen. Stacking the hint on its own second line
|
|
24
|
+
* doubles the row count and, on a long list, overflows the terminal, which
|
|
25
|
+
* makes Ink collapse the two lines onto one (the hint overwrites the label).
|
|
26
|
+
*
|
|
27
|
+
* The visible items are also windowed around the cursor so a long list never
|
|
28
|
+
* renders taller than the terminal; `▲/▼ N more` indicate items out of view.
|
|
29
|
+
*
|
|
30
|
+
* Set isActive=false when another component owns the keyboard (e.g. a
|
|
31
|
+
* TextInput on the same screen) to prevent double-handling.
|
|
32
|
+
*/
|
|
33
|
+
export declare function Select<T>({ items, onSelect, initialIndex, isActive, maxVisible }: SelectProps<T>): React.JSX.Element;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=Select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../src/components/Select.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;IACT,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,WAAW,CAAC,CAAC;IACrB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAgB,EAAE,QAAe,EAAE,UAAU,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,qBA2C3G"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Box, Text, useInput, useStdout } from 'ink';
|
|
4
|
+
/**
|
|
5
|
+
* Arrow-key driven select. Up/Down to move, Enter to confirm.
|
|
6
|
+
*
|
|
7
|
+
* Each item renders on a SINGLE line — `label` followed by a dimmed `hint` —
|
|
8
|
+
* mirroring the Wallet Keys screen. Stacking the hint on its own second line
|
|
9
|
+
* doubles the row count and, on a long list, overflows the terminal, which
|
|
10
|
+
* makes Ink collapse the two lines onto one (the hint overwrites the label).
|
|
11
|
+
*
|
|
12
|
+
* The visible items are also windowed around the cursor so a long list never
|
|
13
|
+
* renders taller than the terminal; `▲/▼ N more` indicate items out of view.
|
|
14
|
+
*
|
|
15
|
+
* Set isActive=false when another component owns the keyboard (e.g. a
|
|
16
|
+
* TextInput on the same screen) to prevent double-handling.
|
|
17
|
+
*/
|
|
18
|
+
export function Select({ items, onSelect, initialIndex = 0, isActive = true, maxVisible }) {
|
|
19
|
+
const [idx, setIdx] = useState(initialIndex);
|
|
20
|
+
const { stdout } = useStdout();
|
|
21
|
+
useInput((_input, key) => {
|
|
22
|
+
if (key.upArrow)
|
|
23
|
+
setIdx((i) => (i <= 0 ? items.length - 1 : i - 1));
|
|
24
|
+
else if (key.downArrow)
|
|
25
|
+
setIdx((i) => (i >= items.length - 1 ? 0 : i + 1));
|
|
26
|
+
else if (key.return)
|
|
27
|
+
onSelect(items[idx].value);
|
|
28
|
+
}, { isActive });
|
|
29
|
+
// Each item is one line; reserve rows for surrounding chrome and the two
|
|
30
|
+
// `more` indicators so the rendered block always fits the terminal.
|
|
31
|
+
const rows = stdout?.rows ?? 24;
|
|
32
|
+
const capacity = Math.max(3, rows - 8);
|
|
33
|
+
const windowSize = Math.min(maxVisible ?? capacity, items.length);
|
|
34
|
+
// Align the dimmed hint into a column after the longest label.
|
|
35
|
+
const labelWidth = Math.min(28, items.reduce((m, it) => Math.max(m, it.label.length), 0));
|
|
36
|
+
// Center the cursor in the window, clamped to the list bounds.
|
|
37
|
+
const clampedIdx = Math.max(0, Math.min(idx, items.length - 1));
|
|
38
|
+
let start = clampedIdx - Math.floor(windowSize / 2);
|
|
39
|
+
start = Math.max(0, Math.min(start, items.length - windowSize));
|
|
40
|
+
const end = start + windowSize;
|
|
41
|
+
const hiddenAbove = start;
|
|
42
|
+
const hiddenBelow = items.length - end;
|
|
43
|
+
return (_jsxs(Box, { flexDirection: "column", children: [hiddenAbove > 0 && _jsxs(Text, { dimColor: true, children: [" \u25B2 ", hiddenAbove, " more"] }), items.slice(start, end).map((item, local) => {
|
|
44
|
+
const i = start + local;
|
|
45
|
+
const active = i === clampedIdx;
|
|
46
|
+
return (_jsxs(Text, { color: active ? 'cyan' : undefined, bold: active, children: [active ? '› ' : ' ', item.label.padEnd(labelWidth), item.hint ? _jsxs(Text, { dimColor: true, children: [" ", item.hint] }) : null] }, i));
|
|
47
|
+
}), hiddenBelow > 0 && _jsxs(Text, { dimColor: true, children: [" \u25BC ", hiddenBelow, " more"] })] }));
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=Select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select.js","sourceRoot":"","sources":["../../src/components/Select.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAqBrD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,MAAM,CAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,GAAG,CAAC,EAAE,QAAQ,GAAG,IAAI,EAAE,UAAU,EAAkB;IAC1G,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAE/B,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACvB,IAAI,GAAG,CAAC,OAAO;YAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAC/D,IAAI,GAAG,CAAC,SAAS;YAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aACtE,IAAI,GAAG,CAAC,MAAM;YAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEjB,yEAAyE;IACzE,oEAAoE;IACpE,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAElE,+DAA+D;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE1F,+DAA+D;IAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,KAAK,GAAG,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACpD,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,KAAK,GAAG,UAAU,CAAC;IAC/B,MAAM,WAAW,GAAG,KAAK,CAAC;IAC1B,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;IAEvC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,WAAW,GAAG,CAAC,IAAI,MAAC,IAAI,IAAC,QAAQ,gCAAM,WAAW,aAAa,EAC/D,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC3C,MAAM,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;gBACxB,MAAM,MAAM,GAAG,CAAC,KAAK,UAAU,CAAC;gBAChC,OAAO,CACL,MAAC,IAAI,IAAS,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,aAC3D,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,EACnD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAC,IAAI,IAAC,QAAQ,yBAAI,IAAI,CAAC,IAAI,IAAQ,CAAC,CAAC,CAAC,IAAI,KAF9C,CAAC,CAGL,CACR,CAAC;YACJ,CAAC,CAAC,EACD,WAAW,GAAG,CAAC,IAAI,MAAC,IAAI,IAAC,QAAQ,gCAAM,WAAW,aAAa,IAC5D,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { TxProgress } from '../types.js';
|
|
3
|
+
interface TxStatusProps {
|
|
4
|
+
progress: TxProgress;
|
|
5
|
+
}
|
|
6
|
+
export declare function TxStatus({ progress }: TxStatusProps): React.JSX.Element | null;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=TxStatus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TxStatus.d.ts","sourceRoot":"","sources":["../../src/components/TxStatus.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,UAAU,aAAa;IACrB,QAAQ,EAAE,UAAU,CAAC;CACtB;AAYD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,4BAyBnD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
import Spinner from 'ink-spinner';
|
|
4
|
+
const STATUS_LABELS = {
|
|
5
|
+
idle: '',
|
|
6
|
+
building: 'Building transaction...',
|
|
7
|
+
proving: 'Generating proof...',
|
|
8
|
+
submitting: 'Submitting to node...',
|
|
9
|
+
confirming: 'Waiting for confirmation...',
|
|
10
|
+
done: 'Transaction confirmed',
|
|
11
|
+
error: 'Transaction failed',
|
|
12
|
+
};
|
|
13
|
+
export function TxStatus({ progress }) {
|
|
14
|
+
if (progress.status === 'idle')
|
|
15
|
+
return null;
|
|
16
|
+
const isActive = ['building', 'proving', 'submitting', 'confirming'].includes(progress.status);
|
|
17
|
+
const color = progress.status === 'done' ? 'green'
|
|
18
|
+
: progress.status === 'error' ? 'red'
|
|
19
|
+
: 'yellow';
|
|
20
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Box, { children: [isActive && _jsx(Spinner, { type: "dots" }), _jsxs(Text, { color: color, children: [" ", STATUS_LABELS[progress.status]] })] }), progress.message && (_jsxs(Text, { dimColor: true, children: [" ", progress.message] })), progress.txHash && (_jsxs(Box, { children: [_jsx(Text, { dimColor: true, children: " TX: " }), _jsx(Text, { children: progress.txHash })] }))] }));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=TxStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TxStatus.js","sourceRoot":"","sources":["../../src/components/TxStatus.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,OAAO,MAAM,aAAa,CAAC;AAOlC,MAAM,aAAa,GAAyC;IAC1D,IAAI,EAAE,EAAE;IACR,QAAQ,EAAE,yBAAyB;IACnC,OAAO,EAAE,qBAAqB;IAC9B,UAAU,EAAE,uBAAuB;IACnC,UAAU,EAAE,6BAA6B;IACzC,IAAI,EAAE,uBAAuB;IAC7B,KAAK,EAAE,oBAAoB;CAC5B,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,EAAE,QAAQ,EAAiB;IAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/F,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO;QAChD,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK;YACrC,CAAC,CAAC,QAAQ,CAAC;IAEb,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACtC,MAAC,GAAG,eACD,QAAQ,IAAI,KAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,EACpC,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,kBAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAQ,IACxD,EACL,QAAQ,CAAC,OAAO,IAAI,CACnB,MAAC,IAAI,IAAC,QAAQ,yBAAI,QAAQ,CAAC,OAAO,IAAQ,CAC3C,EACA,QAAQ,CAAC,MAAM,IAAI,CAClB,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,QAAQ,6BAAc,EAC5B,KAAC,IAAI,cAAE,QAAQ,CAAC,MAAM,GAAQ,IAC1B,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type NetworkConfig, type DustGeneration, type SyncProgress, type WalletCoinDetails, type SubWalletProgress, type WalletKeys } from '@shieldedtech/moth-wallet';
|
|
2
|
+
export declare function useBalance(walletKeys: WalletKeys | null, network: NetworkConfig | null, onLog?: (msg: string) => void, walletName?: string, isNewWallet?: boolean): {
|
|
3
|
+
refresh: () => Promise<void>;
|
|
4
|
+
getFacade: () => import("@midnightntwrk/wallet-sdk-facade").WalletFacade | null;
|
|
5
|
+
nightBalance: string;
|
|
6
|
+
dustBalance: string;
|
|
7
|
+
/** Raw DUST in SPECK (10^15 per DUST). */
|
|
8
|
+
dustRaw: bigint;
|
|
9
|
+
shieldedBalances: Record<string, bigint>;
|
|
10
|
+
unshieldedBalances: Record<string, bigint>;
|
|
11
|
+
synced: boolean;
|
|
12
|
+
syncStatus: string;
|
|
13
|
+
loading: boolean;
|
|
14
|
+
dustGeneration: DustGeneration | null;
|
|
15
|
+
syncProgress: SyncProgress | null;
|
|
16
|
+
coins: WalletCoinDetails;
|
|
17
|
+
subProgress: SubWalletProgress;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=useBalance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBalance.d.ts","sourceRoot":"","sources":["../../src/hooks/useBalance.ts"],"names":[],"mappings":"AACA,OAAO,EASL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,YAAY,EAEjB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAChB,MAAM,2BAA2B,CAAC;AA+CnC,wBAAgB,UAAU,CACxB,UAAU,EAAE,UAAU,GAAG,IAAI,EAC7B,OAAO,EAAE,aAAa,GAAG,IAAI,EAC7B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAC7B,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,OAAO;;;kBAjDP,MAAM;iBACP,MAAM;IACnB,0CAA0C;aACjC,MAAM;sBACG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;wBACpB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;YAClC,OAAO;gBACH,MAAM;aACT,OAAO;oBACA,cAAc,GAAG,IAAI;kBACvB,YAAY,GAAG,IAAI;WAC1B,iBAAiB;iBACX,iBAAiB;EA2H/B"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
2
|
+
import { startWalletSync, formatNight, formatDustBalance, NIGHT_TOKEN_ID, resolveProverConfig, EMPTY_COINS, EMPTY_SUB_PROGRESS, } from '@shieldedtech/moth-wallet';
|
|
3
|
+
const EMPTY_STATE = {
|
|
4
|
+
nightBalance: '0', dustBalance: '0', dustRaw: 0n,
|
|
5
|
+
shieldedBalances: {}, unshieldedBalances: {},
|
|
6
|
+
synced: false, syncStatus: '', loading: false,
|
|
7
|
+
dustGeneration: null, syncProgress: null,
|
|
8
|
+
coins: EMPTY_COINS, subProgress: EMPTY_SUB_PROGRESS,
|
|
9
|
+
};
|
|
10
|
+
function balancesToState(b, status) {
|
|
11
|
+
const nightRaw = (b.unshielded[NIGHT_TOKEN_ID] ?? 0n) + (b.shielded[NIGHT_TOKEN_ID] ?? 0n);
|
|
12
|
+
const nightStr = formatNight(nightRaw);
|
|
13
|
+
return {
|
|
14
|
+
nightBalance: nightStr,
|
|
15
|
+
// DUST is SPECKS (10^15 per DUST); formatNight divides by 10^6 and would
|
|
16
|
+
// render every balance a billion times too large.
|
|
17
|
+
dustBalance: formatDustBalance(b.dust),
|
|
18
|
+
dustRaw: b.dust,
|
|
19
|
+
shieldedBalances: b.shielded,
|
|
20
|
+
unshieldedBalances: b.unshielded,
|
|
21
|
+
synced: b.synced,
|
|
22
|
+
syncStatus: status ?? (b.synced ? `● synced` : `syncing — NIGHT: ${nightStr}`),
|
|
23
|
+
loading: false,
|
|
24
|
+
dustGeneration: b.dustGeneration,
|
|
25
|
+
syncProgress: b.syncProgress,
|
|
26
|
+
coins: b.coins,
|
|
27
|
+
subProgress: b.subProgress,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function useBalance(walletKeys, network, onLog, walletName, isNewWallet) {
|
|
31
|
+
const prover = network ? resolveProverConfig(network) : null;
|
|
32
|
+
const proverKey = prover?.type === 'server' ? `server:${prover.url}` : (prover?.type ?? '');
|
|
33
|
+
const [state, setState] = useState(EMPTY_STATE);
|
|
34
|
+
const syncRef = useRef(null);
|
|
35
|
+
const unsubRef = useRef(null);
|
|
36
|
+
const onLogRef = useRef(onLog);
|
|
37
|
+
onLogRef.current = onLog;
|
|
38
|
+
const startSync = useCallback(async () => {
|
|
39
|
+
if (!walletKeys || !network) {
|
|
40
|
+
onLogRef.current?.(`[sync] not starting — ${!walletKeys ? 'no wallet keys (wallet locked?)' : 'no network'}`);
|
|
41
|
+
setState(EMPTY_STATE);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (unsubRef.current) {
|
|
45
|
+
unsubRef.current();
|
|
46
|
+
unsubRef.current = null;
|
|
47
|
+
}
|
|
48
|
+
if (syncRef.current) {
|
|
49
|
+
await syncRef.current.stop();
|
|
50
|
+
syncRef.current = null;
|
|
51
|
+
}
|
|
52
|
+
// Reset to empty (not `...prev`) so a wallet/network switch never shows the
|
|
53
|
+
// PREVIOUS wallet's balances/coins/progress while the new wallet syncs.
|
|
54
|
+
// startSync only re-runs when walletKeys / network / walletName change, so
|
|
55
|
+
// this clears stale data exactly on a switch — not during normal operation.
|
|
56
|
+
setState({ ...EMPTY_STATE, loading: true, syncStatus: 'Starting sync...' });
|
|
57
|
+
try {
|
|
58
|
+
onLogRef.current?.(`[sync] startWalletSync begin — wallet=${walletName ?? '?'} network=${network.id} indexer=${network.indexerUrl}`);
|
|
59
|
+
const synced = await startWalletSync(walletKeys, network, (msg) => {
|
|
60
|
+
setState(prev => ({ ...prev, syncStatus: msg }));
|
|
61
|
+
}, walletName, isNewWallet);
|
|
62
|
+
onLogRef.current?.('[sync] startWalletSync resolved — facade ready, subscribing');
|
|
63
|
+
syncRef.current = synced;
|
|
64
|
+
let firstEmit = true;
|
|
65
|
+
const unsub = synced.subscribe((balances) => {
|
|
66
|
+
if (firstEmit) {
|
|
67
|
+
firstEmit = false;
|
|
68
|
+
onLogRef.current?.(`[sync] first balance emit — synced=${balances.synced} pct=${Math.round((balances.syncProgress?.percentage ?? 0) * 100)}%`);
|
|
69
|
+
}
|
|
70
|
+
setState(balancesToState(balances));
|
|
71
|
+
});
|
|
72
|
+
unsubRef.current = unsub;
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
76
|
+
setState(prev => ({ ...prev, synced: false, syncStatus: `Sync failed: ${msg}`, loading: false }));
|
|
77
|
+
onLogRef.current?.(`Sync failed: ${msg}`);
|
|
78
|
+
}
|
|
79
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
80
|
+
}, [walletKeys, network?.id, network?.nodeUrl, network?.indexerUrl, proverKey, walletName, isNewWallet]);
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
startSync();
|
|
83
|
+
// Fallback poller
|
|
84
|
+
const poller = setInterval(async () => {
|
|
85
|
+
if (syncRef.current) {
|
|
86
|
+
try {
|
|
87
|
+
const b = await syncRef.current.refresh();
|
|
88
|
+
setState(prev => {
|
|
89
|
+
const next = balancesToState(b);
|
|
90
|
+
if (prev.nightBalance === next.nightBalance && prev.dustBalance === next.dustBalance && prev.synced === next.synced)
|
|
91
|
+
return prev;
|
|
92
|
+
return next;
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch { /* facade not ready yet */ }
|
|
96
|
+
}
|
|
97
|
+
}, 5_000);
|
|
98
|
+
return () => {
|
|
99
|
+
clearInterval(poller);
|
|
100
|
+
if (unsubRef.current) {
|
|
101
|
+
unsubRef.current();
|
|
102
|
+
unsubRef.current = null;
|
|
103
|
+
}
|
|
104
|
+
if (syncRef.current) {
|
|
105
|
+
syncRef.current.stop().catch(() => { });
|
|
106
|
+
syncRef.current = null;
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}, [startSync]);
|
|
110
|
+
const refresh = useCallback(async () => {
|
|
111
|
+
if (syncRef.current) {
|
|
112
|
+
const b = await syncRef.current.refresh();
|
|
113
|
+
setState(balancesToState(b));
|
|
114
|
+
}
|
|
115
|
+
}, []);
|
|
116
|
+
const getFacade = useCallback(() => syncRef.current?.facade ?? null, []);
|
|
117
|
+
return { ...state, refresh, getFacade };
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=useBalance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBalance.js","sourceRoot":"","sources":["../../src/hooks/useBalance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { NetworkConfig } from '@shieldedtech/moth-wallet';
|
|
2
|
+
export interface ChainStatus {
|
|
3
|
+
peers: number;
|
|
4
|
+
epoch: number;
|
|
5
|
+
slot: number;
|
|
6
|
+
blockHeight: number;
|
|
7
|
+
blockHash: string;
|
|
8
|
+
indexerHeight: number;
|
|
9
|
+
synced: boolean;
|
|
10
|
+
connected: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function useChainStatus(network: NetworkConfig | null, intervalMs?: number): ChainStatus;
|
|
13
|
+
//# sourceMappingURL=useChainStatus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChainStatus.d.ts","sourceRoot":"","sources":["../../src/hooks/useChainStatus.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAmCD,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,EAAE,UAAU,SAAQ,eA6D/E"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// Chain status polling — epoch, slot, peers, block hash, indexer height.
|
|
2
|
+
// Polls via JSON-RPC like mn-tui's useMidnightNode. See NOTICE for attribution.
|
|
3
|
+
import { useState, useEffect, useRef } from 'react';
|
|
4
|
+
const INITIAL = {
|
|
5
|
+
peers: 0, epoch: 0, slot: 0, blockHeight: 0,
|
|
6
|
+
blockHash: '', indexerHeight: 0, synced: false, connected: false,
|
|
7
|
+
};
|
|
8
|
+
// Midnight: 300 slots/epoch, 3s/slot
|
|
9
|
+
const SLOTS_PER_EPOCH = 300;
|
|
10
|
+
async function rpcCall(url, method, params = []) {
|
|
11
|
+
const httpUrl = url.replace('ws://', 'http://').replace('wss://', 'https://');
|
|
12
|
+
const res = await fetch(httpUrl, {
|
|
13
|
+
method: 'POST',
|
|
14
|
+
headers: { 'Content-Type': 'application/json' },
|
|
15
|
+
body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
|
|
16
|
+
signal: AbortSignal.timeout(5_000),
|
|
17
|
+
});
|
|
18
|
+
const json = await res.json();
|
|
19
|
+
if (json.error)
|
|
20
|
+
throw new Error(json.error.message);
|
|
21
|
+
return json.result;
|
|
22
|
+
}
|
|
23
|
+
async function graphqlQuery(url, query) {
|
|
24
|
+
const res = await fetch(url, {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: { 'Content-Type': 'application/json' },
|
|
27
|
+
body: JSON.stringify({ query }),
|
|
28
|
+
signal: AbortSignal.timeout(5_000),
|
|
29
|
+
});
|
|
30
|
+
const json = await res.json();
|
|
31
|
+
if (json.errors?.length)
|
|
32
|
+
throw new Error(json.errors[0].message);
|
|
33
|
+
return json.data;
|
|
34
|
+
}
|
|
35
|
+
export function useChainStatus(network, intervalMs = 6_000) {
|
|
36
|
+
const [status, setStatus] = useState(INITIAL);
|
|
37
|
+
const intervalRef = useRef(null);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (!network) {
|
|
40
|
+
setStatus(INITIAL);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const poll = async () => {
|
|
44
|
+
try {
|
|
45
|
+
// Parallel RPC calls
|
|
46
|
+
const [header, health, indexerData] = await Promise.all([
|
|
47
|
+
rpcCall(network.nodeUrl, 'chain_getHeader'),
|
|
48
|
+
rpcCall(network.nodeUrl, 'system_health'),
|
|
49
|
+
graphqlQuery(network.indexerUrl, '{ block { height } }').catch(() => ({ block: { height: 0 } })),
|
|
50
|
+
]);
|
|
51
|
+
const blockHeight = parseInt(header.number, 16);
|
|
52
|
+
// Get block hash for the current block
|
|
53
|
+
const blockHash = await rpcCall(network.nodeUrl, 'chain_getBlockHash', []).catch(() => '');
|
|
54
|
+
// Derive epoch/slot from sidechain RPC if available. Public networks may not
|
|
55
|
+
// expose sidechain_getStatus, or may return partial data — fall back per-field
|
|
56
|
+
// to a block-height-based estimate so we never render NaN/undefined.
|
|
57
|
+
let epoch;
|
|
58
|
+
let slot;
|
|
59
|
+
try {
|
|
60
|
+
const sidechain = await rpcCall(network.nodeUrl, 'sidechain_getStatus', []);
|
|
61
|
+
if (sidechain && typeof sidechain === 'object') {
|
|
62
|
+
if (typeof sidechain.slot === 'number')
|
|
63
|
+
slot = sidechain.slot;
|
|
64
|
+
if (typeof sidechain.epoch === 'number')
|
|
65
|
+
epoch = sidechain.epoch;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch { /* method not supported — fall through to estimate */ }
|
|
69
|
+
if (typeof slot !== 'number' || !Number.isFinite(slot))
|
|
70
|
+
slot = blockHeight;
|
|
71
|
+
if (typeof epoch !== 'number' || !Number.isFinite(epoch))
|
|
72
|
+
epoch = Math.floor(slot / SLOTS_PER_EPOCH);
|
|
73
|
+
setStatus({
|
|
74
|
+
peers: health.peers,
|
|
75
|
+
epoch,
|
|
76
|
+
slot,
|
|
77
|
+
blockHeight,
|
|
78
|
+
blockHash: blockHash || header.parentHash,
|
|
79
|
+
indexerHeight: indexerData.block.height,
|
|
80
|
+
synced: !health.isSyncing,
|
|
81
|
+
connected: true,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
setStatus(prev => ({ ...prev, connected: false }));
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
poll();
|
|
89
|
+
intervalRef.current = setInterval(poll, intervalMs);
|
|
90
|
+
return () => {
|
|
91
|
+
if (intervalRef.current)
|
|
92
|
+
clearInterval(intervalRef.current);
|
|
93
|
+
};
|
|
94
|
+
}, [network?.nodeUrl, network?.indexerUrl, intervalMs]);
|
|
95
|
+
return status;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=useChainStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChainStatus.js","sourceRoot":"","sources":["../../src/hooks/useChainStatus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type NetworkConfig, type WalletBalances, type WalletKeys, type ConfirmationQueue } from '@shieldedtech/moth-wallet';
|
|
2
|
+
import type { WalletFacade } from '@midnightntwrk/wallet-sdk/facade';
|
|
3
|
+
export interface UseDaemonHostOptions {
|
|
4
|
+
readonly network: NetworkConfig | null;
|
|
5
|
+
readonly walletName: string | undefined;
|
|
6
|
+
/** Ref to the latest WalletBalances snapshot. Read at handler-call
|
|
7
|
+
* time so getState always reflects current state. */
|
|
8
|
+
readonly balancesRef: React.MutableRefObject<WalletBalances | null>;
|
|
9
|
+
/** Getter for the live WalletFacade. Returns null when no wallet is
|
|
10
|
+
* unlocked or sync hasn't initialized yet — write verbs reject in
|
|
11
|
+
* that case. */
|
|
12
|
+
readonly getFacade: () => WalletFacade | null;
|
|
13
|
+
/** Getter for the active wallet's typed key bundle (D-KM-3). */
|
|
14
|
+
readonly getWalletKeys: () => WalletKeys | null;
|
|
15
|
+
readonly queue: ConfirmationQueue;
|
|
16
|
+
readonly daemonVersion: string;
|
|
17
|
+
readonly logs?: {
|
|
18
|
+
info?: (msg: string) => void;
|
|
19
|
+
warn?: (msg: string) => void;
|
|
20
|
+
error?: (msg: string) => void;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export type UseDaemonHostStatus = 'idle' | 'starting' | 'listening' | 'failed';
|
|
24
|
+
export interface UseDaemonHostState {
|
|
25
|
+
readonly status: UseDaemonHostStatus;
|
|
26
|
+
readonly socketPath: string | null;
|
|
27
|
+
readonly lastError: string | null;
|
|
28
|
+
}
|
|
29
|
+
export declare function useDaemonHost(opts: UseDaemonHostOptions): UseDaemonHostState;
|
|
30
|
+
//# sourceMappingURL=useDaemonHost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDaemonHost.d.ts","sourceRoot":"","sources":["../../src/hooks/useDaemonHost.ts"],"names":[],"mappings":"AAcA,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kCAAkC,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC;0DACsD;IACtD,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACpE;;qBAEiB;IACjB,QAAQ,CAAC,SAAS,EAAE,MAAM,YAAY,GAAG,IAAI,CAAC;IAC9C,gEAAgE;IAChE,QAAQ,CAAC,aAAa,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE;QACd,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE/E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,kBAAkB,CAgH5E"}
|