mirror of https://github.com/lukechilds/polar.git
jamaljsr
5 years ago
5 changed files with 0 additions and 205 deletions
@ -1,12 +0,0 @@ |
|||||
import React from 'react'; |
|
||||
import { LightningNode } from 'shared/types'; |
|
||||
|
|
||||
interface Props { |
|
||||
node: LightningNode; |
|
||||
} |
|
||||
|
|
||||
const ConnectTab: React.FC<Props> = ({ node }) => { |
|
||||
return <div>Actions {node.name}</div>; |
|
||||
}; |
|
||||
|
|
||||
export default ConnectTab; |
|
@ -1,12 +0,0 @@ |
|||||
import React from 'react'; |
|
||||
import { LightningNode } from 'shared/types'; |
|
||||
|
|
||||
interface Props { |
|
||||
node: LightningNode; |
|
||||
} |
|
||||
|
|
||||
const ConnectTab: React.FC<Props> = ({ node }) => { |
|
||||
return <div>Connect {node.name}</div>; |
|
||||
}; |
|
||||
|
|
||||
export default ConnectTab; |
|
@ -1,96 +0,0 @@ |
|||||
import React from 'react'; |
|
||||
import { Alert, Tooltip } from 'antd'; |
|
||||
import { usePrefixedTranslation } from 'hooks'; |
|
||||
import { LightningNode, Status } from 'shared/types'; |
|
||||
import { useStoreState } from 'store'; |
|
||||
import { ellipseInner } from 'utils/strings'; |
|
||||
import { format } from 'utils/units'; |
|
||||
import { StatusBadge } from 'components/common'; |
|
||||
import CopyIcon from 'components/common/CopyIcon'; |
|
||||
import DetailsList, { DetailValues } from 'components/common/DetailsList'; |
|
||||
|
|
||||
interface Props { |
|
||||
node: LightningNode; |
|
||||
} |
|
||||
|
|
||||
const InfoTab: React.FC<Props> = ({ node }) => { |
|
||||
const { l } = usePrefixedTranslation('cmps.designer.lightning.InfoTab'); |
|
||||
const { nodes } = useStoreState(s => s.lightning); |
|
||||
const details: DetailValues = [ |
|
||||
{ label: l('nodeType'), value: node.type }, |
|
||||
{ label: l('implementation'), value: node.implementation }, |
|
||||
{ label: l('version'), value: `v${node.version}` }, |
|
||||
{ |
|
||||
label: l('status'), |
|
||||
value: ( |
|
||||
<StatusBadge |
|
||||
status={node.status} |
|
||||
text={l(`enums.status.${Status[node.status]}`)} |
|
||||
/> |
|
||||
), |
|
||||
}, |
|
||||
]; |
|
||||
|
|
||||
let synced = false; |
|
||||
const nodeState = nodes[node.name]; |
|
||||
if (node.status === Status.Started && nodeState) { |
|
||||
if (nodeState.balances) { |
|
||||
const { confirmed, unconfirmed } = nodeState.balances; |
|
||||
details.push({ |
|
||||
label: l('confirmedBalance'), |
|
||||
value: `${format(confirmed)} sats`, |
|
||||
}); |
|
||||
details.push({ |
|
||||
label: l('unconfirmedBalance'), |
|
||||
value: `${format(unconfirmed)} sats`, |
|
||||
}); |
|
||||
} |
|
||||
if (nodeState.info) { |
|
||||
const { |
|
||||
pubkey, |
|
||||
alias, |
|
||||
syncedToChain, |
|
||||
numPendingChannels, |
|
||||
numActiveChannels, |
|
||||
numInactiveChannels, |
|
||||
} = nodeState.info; |
|
||||
const pubkeyCmp = ( |
|
||||
<> |
|
||||
{ellipseInner(pubkey)} |
|
||||
<CopyIcon value={pubkey} label="PubKey" /> |
|
||||
</> |
|
||||
); |
|
||||
const channels = ( |
|
||||
<Tooltip title={l('channelsTooltip')}> |
|
||||
{`${numActiveChannels} / ${numPendingChannels} / ${numInactiveChannels}`} |
|
||||
</Tooltip> |
|
||||
); |
|
||||
details.push( |
|
||||
{ label: l('alias'), value: alias }, |
|
||||
{ label: l('pubkey'), value: pubkeyCmp }, |
|
||||
{ label: l('channels'), value: channels }, |
|
||||
); |
|
||||
synced = syncedToChain; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
return ( |
|
||||
<> |
|
||||
{!synced && ( |
|
||||
<Alert type="warning" message={l('syncWarning')} closable={false} showIcon /> |
|
||||
)} |
|
||||
{node.status === Status.Error && node.errorMsg && ( |
|
||||
<Alert |
|
||||
type="error" |
|
||||
message={l('startError', { implementation: node.implementation })} |
|
||||
description={node.errorMsg} |
|
||||
closable={false} |
|
||||
showIcon |
|
||||
/> |
|
||||
)} |
|
||||
<DetailsList details={details} /> |
|
||||
</> |
|
||||
); |
|
||||
}; |
|
||||
|
|
||||
export default InfoTab; |
|
@ -1,82 +0,0 @@ |
|||||
import React, { ReactNode, useState } from 'react'; |
|
||||
import { useAsync } from 'react-async-hook'; |
|
||||
import { Alert, Icon } from 'antd'; |
|
||||
import { usePrefixedTranslation } from 'hooks'; |
|
||||
import { LightningNode, Status } from 'shared/types'; |
|
||||
import { useStoreActions, useStoreState } from 'store'; |
|
||||
import { abbreviate } from 'utils/numbers'; |
|
||||
import { Loader } from 'components/common'; |
|
||||
import SidebarCard from '../SidebarCard'; |
|
||||
import { ActionsTab, ConnectTab, InfoTab } from './'; |
|
||||
|
|
||||
interface Props { |
|
||||
node: LightningNode; |
|
||||
} |
|
||||
|
|
||||
const LightningDetails: React.FC<Props> = ({ node }) => { |
|
||||
const { l } = usePrefixedTranslation('cmps.designer.lightning.LightningNodeDetails'); |
|
||||
const [activeTab, setActiveTab] = useState('info'); |
|
||||
const { getInfo, getBalances } = useStoreActions(s => s.lightning); |
|
||||
|
|
||||
const getInfoAsync = useAsync( |
|
||||
async (node: LightningNode) => { |
|
||||
if (node.status === Status.Started) { |
|
||||
await getInfo(node); |
|
||||
await getBalances(node); |
|
||||
} |
|
||||
}, |
|
||||
[node], |
|
||||
); |
|
||||
|
|
||||
let extra: ReactNode | undefined; |
|
||||
const { nodes } = useStoreState(s => s.lightning); |
|
||||
const nodeState = nodes[node.name]; |
|
||||
if (node.status === Status.Started && nodeState) { |
|
||||
if (nodeState.balances) { |
|
||||
const { confirmed } = nodeState.balances; |
|
||||
extra = <strong>{abbreviate(confirmed)} sats</strong>; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
const tabHeaders = [ |
|
||||
{ key: 'info', tab: l('info') }, |
|
||||
{ key: 'connect', tab: l('connect') }, |
|
||||
{ key: 'actions', tab: l('actions') }, |
|
||||
]; |
|
||||
const tabContents: Record<string, ReactNode> = { |
|
||||
info: <InfoTab node={node} />, |
|
||||
connect: <ConnectTab node={node} />, |
|
||||
actions: <ActionsTab node={node} />, |
|
||||
}; |
|
||||
return ( |
|
||||
<SidebarCard |
|
||||
title={node.name} |
|
||||
extra={extra} |
|
||||
tabList={tabHeaders} |
|
||||
activeTabKey={activeTab} |
|
||||
onTabChange={setActiveTab} |
|
||||
> |
|
||||
{node.status === Status.Starting && ( |
|
||||
<Alert |
|
||||
type="info" |
|
||||
showIcon |
|
||||
icon={<Icon type="loading" />} |
|
||||
closable={false} |
|
||||
message={l('waitingNotice', { implementation: node.implementation })} |
|
||||
/> |
|
||||
)} |
|
||||
{node.status !== Status.Started && !nodeState && getInfoAsync.loading && <Loader />} |
|
||||
{getInfoAsync.error && node.status === Status.Started && ( |
|
||||
<Alert |
|
||||
type="error" |
|
||||
closable={false} |
|
||||
message={l('connectError')} |
|
||||
description={getInfoAsync.error.message} |
|
||||
/> |
|
||||
)} |
|
||||
{tabContents[activeTab]} |
|
||||
</SidebarCard> |
|
||||
); |
|
||||
}; |
|
||||
|
|
||||
export default LightningDetails; |
|
@ -1,3 +0,0 @@ |
|||||
export { default as InfoTab } from './InfoTab'; |
|
||||
export { default as ConnectTab } from './ConnectTab'; |
|
||||
export { default as ActionsTab } from './ActionsTab'; |
|
Loading…
Reference in new issue