Merge pull request #1113 from Ride-The-Lightning/help-section-update

Help section update #1112
pull/1116/head
ShahanaFarooqui 2 years ago committed by GitHub
commit 9b519e0267
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -245,7 +245,7 @@ export const getConfig = (req, res, next) => {
if (jsonConfig['Application Options'] && jsonConfig['Application Options'].color) { if (jsonConfig['Application Options'] && jsonConfig['Application Options'].color) {
jsonConfig['Application Options'].color = '#' + jsonConfig['Application Options'].color; jsonConfig['Application Options'].color = '#' + jsonConfig['Application Options'].color;
} }
if (req.session.selectedNode.ln_implementation === 'ECL' && !jsonConfig['eclair.api.password']) { if (req.params.nodeType === 'ln' && req.session.selectedNode.ln_implementation === 'ECL' && !jsonConfig['eclair.api.password']) {
fileFormat = 'HOCON'; fileFormat = 'HOCON';
jsonConfig = parseHocon(data); jsonConfig = parseHocon(data);
} }

@ -13,6 +13,6 @@
<style>@font-face{font-family:Roboto;src:url(Roboto-Thin.f7a95c9c5999532c.woff2) format("woff2"),url(Roboto-Thin.c13c157cb81e8ebb.woff) format("woff");font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-ThinItalic.b0e084abf689f393.woff2) format("woff2"),url(Roboto-ThinItalic.1111028df6cea564.woff) format("woff");font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Light.0e01b6cd13b3857f.woff2) format("woff2"),url(Roboto-Light.603ca9a537b88428.woff) format("woff");font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-LightItalic.232ef4b20215f720.woff2) format("woff2"),url(Roboto-LightItalic.1b5e142f787151c8.woff) format("woff");font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Regular.475ba9e4e2d63456.woff2) format("woff2"),url(Roboto-Regular.bcefbfee882bc1cb.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-RegularItalic.e3a9ebdaac06bbc4.woff2) format("woff2"),url(Roboto-RegularItalic.0668fae6af0cf8c2.woff) format("woff");font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Medium.457532032ceb0168.woff2) format("woff2"),url(Roboto-Medium.6e1ae5f0b324a0aa.woff) format("woff");font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-MediumItalic.872f7060602d55d2.woff2) format("woff2"),url(Roboto-MediumItalic.e06fb533801cbb08.woff) format("woff");font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Bold.447291a88c067396.woff2) format("woff2"),url(Roboto-Bold.fc482e6133cf5e26.woff) format("woff");font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-BoldItalic.1b15168ef6fa4e16.woff2) format("woff2"),url(Roboto-BoldItalic.e26ba339b06f09f7.woff) format("woff");font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Black.2eaa390d458c877d.woff2) format("woff2"),url(Roboto-Black.b25f67ad8583da68.woff) format("woff");font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-BlackItalic.7dc03ee444552bc5.woff2) format("woff2"),url(Roboto-BlackItalic.c8dc642467cb3099.woff) format("woff");font-weight:900;font-style:italic}html{width:100%;height:99%;line-height:1.5;overflow-x:hidden;font-family:Roboto,sans-serif!important;font-size:62.5%}body{box-sizing:border-box;height:100%;margin:0;overflow:hidden}*{margin:0;padding:0}</style><link rel="stylesheet" href="styles.43515fc39338348b.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles.43515fc39338348b.css"></noscript></head> <style>@font-face{font-family:Roboto;src:url(Roboto-Thin.f7a95c9c5999532c.woff2) format("woff2"),url(Roboto-Thin.c13c157cb81e8ebb.woff) format("woff");font-weight:100;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-ThinItalic.b0e084abf689f393.woff2) format("woff2"),url(Roboto-ThinItalic.1111028df6cea564.woff) format("woff");font-weight:100;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Light.0e01b6cd13b3857f.woff2) format("woff2"),url(Roboto-Light.603ca9a537b88428.woff) format("woff");font-weight:300;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-LightItalic.232ef4b20215f720.woff2) format("woff2"),url(Roboto-LightItalic.1b5e142f787151c8.woff) format("woff");font-weight:300;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Regular.475ba9e4e2d63456.woff2) format("woff2"),url(Roboto-Regular.bcefbfee882bc1cb.woff) format("woff");font-weight:400;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-RegularItalic.e3a9ebdaac06bbc4.woff2) format("woff2"),url(Roboto-RegularItalic.0668fae6af0cf8c2.woff) format("woff");font-weight:400;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Medium.457532032ceb0168.woff2) format("woff2"),url(Roboto-Medium.6e1ae5f0b324a0aa.woff) format("woff");font-weight:500;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-MediumItalic.872f7060602d55d2.woff2) format("woff2"),url(Roboto-MediumItalic.e06fb533801cbb08.woff) format("woff");font-weight:500;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Bold.447291a88c067396.woff2) format("woff2"),url(Roboto-Bold.fc482e6133cf5e26.woff) format("woff");font-weight:700;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-BoldItalic.1b15168ef6fa4e16.woff2) format("woff2"),url(Roboto-BoldItalic.e26ba339b06f09f7.woff) format("woff");font-weight:700;font-style:italic}@font-face{font-family:Roboto;src:url(Roboto-Black.2eaa390d458c877d.woff2) format("woff2"),url(Roboto-Black.b25f67ad8583da68.woff) format("woff");font-weight:900;font-style:normal}@font-face{font-family:Roboto;src:url(Roboto-BlackItalic.7dc03ee444552bc5.woff2) format("woff2"),url(Roboto-BlackItalic.c8dc642467cb3099.woff) format("woff");font-weight:900;font-style:italic}html{width:100%;height:99%;line-height:1.5;overflow-x:hidden;font-family:Roboto,sans-serif!important;font-size:62.5%}body{box-sizing:border-box;height:100%;margin:0;overflow:hidden}*{margin:0;padding:0}</style><link rel="stylesheet" href="styles.43515fc39338348b.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles.43515fc39338348b.css"></noscript></head>
<body> <body>
<rtl-app></rtl-app> <rtl-app></rtl-app>
<script src="runtime.3a8ac8969006b863.js" type="module"></script><script src="polyfills.eddc63f1737a019a.js" type="module"></script><script src="main.6973911fedddc5f0.js" type="module"></script> <script src="runtime.3a8ac8969006b863.js" type="module"></script><script src="polyfills.eddc63f1737a019a.js" type="module"></script><script src="main.0a28b146399d54a7.js" type="module"></script>
</body></html> </body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -12,7 +12,7 @@
"buildfrontend": "ng build --configuration production", "buildfrontend": "ng build --configuration production",
"buildbackend": "tsc --project tsconfig.json", "buildbackend": "tsc --project tsconfig.json",
"watchbackend": "tsc --project tsconfig.json --watch", "watchbackend": "tsc --project tsconfig.json --watch",
"server": "set NODE_ENV=development&&nodemon ./rtl.js", "server": "set NODE_ENV=development&&nodemon --watch backend --watch server ./rtl.js",
"serverUbuntu": "NODE_ENV=development nodemon --watch backend --watch server ./rtl.js", "serverUbuntu": "NODE_ENV=development nodemon --watch backend --watch server ./rtl.js",
"testdev": "ng test --watch=true --code-coverage", "testdev": "ng test --watch=true --code-coverage",
"test": "ng test --watch=false", "test": "ng test --watch=false",

@ -241,7 +241,7 @@ export const getConfig = (req, res, next) => {
if (jsonConfig['Application Options'] && jsonConfig['Application Options'].color) { if (jsonConfig['Application Options'] && jsonConfig['Application Options'].color) {
jsonConfig['Application Options'].color = '#' + jsonConfig['Application Options'].color; jsonConfig['Application Options'].color = '#' + jsonConfig['Application Options'].color;
} }
if (req.session.selectedNode.ln_implementation === 'ECL' && !jsonConfig['eclair.api.password']) { if (req.params.nodeType === 'ln' && req.session.selectedNode.ln_implementation === 'ECL' && !jsonConfig['eclair.api.password']) {
fileFormat = 'HOCON'; fileFormat = 'HOCON';
jsonConfig = parseHocon(data); jsonConfig = parseHocon(data);
} }

@ -12,7 +12,7 @@
</mat-expansion-panel-header> </mat-expansion-panel-header>
<mat-panel-description fxLayout="column" fxFlex="100" fxLayoutAlign="start start"> <mat-panel-description fxLayout="column" fxFlex="100" fxLayoutAlign="start start">
<span class="pre-wrap" [innerHTML]="helpTopic.help.answer"></span> <span class="pre-wrap" [innerHTML]="helpTopic.help.answer"></span>
<a class="mt-2" [routerLink]="flgLoggedIn ? LNPLink + helpTopic.help.link : '/login'">{{!flgLoggedIn ? 'Login to go to the page' : helpTopic.help.linkCaption}}</a> <a class="mt-2" [routerLink]="flgLoggedIn ? helpTopic.help.link : '/login'">{{!flgLoggedIn ? 'Login to go to the page' : helpTopic.help.linkCaption}}</a>
</mat-panel-description> </mat-panel-description>
</mat-expansion-panel> </mat-expansion-panel>
</div> </div>

@ -24,7 +24,28 @@ export class HelpComponent implements OnInit, OnDestroy {
public flgLoggedIn = false; public flgLoggedIn = false;
private unSubs = [new Subject(), new Subject(), new Subject(), new Subject()]; private unSubs = [new Subject(), new Subject(), new Subject(), new Subject()];
constructor(private store: Store<RTLState>, private sessionService: SessionService) { constructor(private store: Store<RTLState>, private sessionService: SessionService) {}
ngOnInit() {
this.store.select(rootSelectedNode).pipe(takeUntil(this.unSubs[0])).subscribe((selNode) => {
this.selNode = selNode;
if (this.selNode.lnImplementation && this.selNode.lnImplementation.trim() !== '') {
this.LNPLink = '/' + this.selNode.lnImplementation.toLowerCase() + '/';
this.addHelpTopics();
}
});
this.sessionService.watchSession().
pipe(takeUntil(this.unSubs[1])).
subscribe((session) => {
this.flgLoggedIn = !!session.token;
});
if (this.sessionService.getItem('token')) {
this.flgLoggedIn = true;
}
}
addHelpTopics() {
this.helpTopics = [];
this.helpTopics.push(new HelpTopic({ this.helpTopics.push(new HelpTopic({
question: 'Getting started', question: 'Getting started',
answer: 'Funding your node is the first step to get started.\n' + answer: 'Funding your node is the first step to get started.\n' +
@ -33,8 +54,8 @@ export class HelpComponent implements OnInit, OnDestroy {
'2. Send funds to the address.\n' + '2. Send funds to the address.\n' +
'3. Wait for the balance to be confirmed on-chain before proceeding further.\n' + '3. Wait for the balance to be confirmed on-chain before proceeding further.\n' +
'3. Connecting with network peers and opening channels is next.\n', '3. Connecting with network peers and opening channels is next.\n',
link: 'onchain', link: this.LNPLink + 'onchain/receive/utxos',
linkCaption: 'On-Chain page', linkCaption: 'On-Chain',
lnImplementation: 'ALL' lnImplementation: 'ALL'
})); }));
this.helpTopics.push(new HelpTopic({ this.helpTopics.push(new HelpTopic({
@ -48,24 +69,25 @@ export class HelpComponent implements OnInit, OnDestroy {
' a. View Info - View the peer details.\n' + ' a. View Info - View the peer details.\n' +
' b. Open Channel - Open channel with the peer.\n' + ' b. Open Channel - Open channel with the peer.\n' +
' c. Disconnect - Disconnect from the peer.\n', ' c. Disconnect - Disconnect from the peer.\n',
link: 'peerschannels', link: this.LNPLink + 'connections/peers',
linkCaption: 'Peers/Channels page', linkCaption: 'Peers',
lnImplementation: 'ALL' lnImplementation: 'ALL'
})); }));
this.helpTopics.push(new HelpTopic({ this.helpTopics.push(new HelpTopic({
question: 'Opening Channels', question: 'Opening Channels',
answer: 'Open channels with a connected network peer.\n' + answer: 'Open channels with a connected peer.\n' +
'Go to "Peer/Channels" page under the "Lightning" menu:\n' + 'Go to "Peer/Channels" page under the "Lightning" menu:\n' +
'1. On the "Channels" section, select the alias of the connected peer from the drop-down\n' + '1. On the "Channels" section, click on "Open Channel"\n' +
'2. On the "Open Channel" modal, select the alias of the connected peer from the drop-down\n' +
'2. Specify the amount to commit to the channel and click on "Open Channel".\n' + '2. Specify the amount to commit to the channel and click on "Open Channel".\n' +
'3. There are a variety of options available while opening a channel. \n' + '3. There are a variety of options available while opening a channel. \n' +
' a. Private Channel - When this option is selected, a private channel is opened with the peer. \n' + ' a. Private Channel - When this option is selected, a private channel is opened with the peer. \n' +
' b. Priority (advanced option) - Specify either Target confirmation Block or Fee in Sat/vByte. \n' + ' b. Priority (advanced option) - Specify either Target confirmation Block or Fee in Sat/vByte. \n' +
' c. Spend Unconfirmd Output (advanced option) - Allow channels to be opened with unconfirmed UTXOs.\n' + ' c. Spend Unconfirmd Output (advanced option) - Allow channels to be opened with unconfirmed UTXOs.\n' +
'4. Track the pending open channels under the "Pending" tab . \n' + '4. Track the pending open channels under the "Pending" tab. \n' +
'5. Wait for the channel to be confirmed. Only a confimed channel can be used for payments or routing. \n', '5. Wait for the channel to be confirmed. Only a confimed channel can be used for payments or routing. \n',
link: 'peerschannels', link: this.LNPLink + 'connections/channels/open',
linkCaption: 'Peers/Channels page', linkCaption: 'Channels',
lnImplementation: 'ALL' lnImplementation: 'ALL'
})); }));
this.helpTopics.push(new HelpTopic({ this.helpTopics.push(new HelpTopic({
@ -76,49 +98,70 @@ export class HelpComponent implements OnInit, OnDestroy {
' a. View Info - View the channel details.\n' + ' a. View Info - View the channel details.\n' +
' b. View Remote Fee - View the fee policy on the channel of the remote peer.\n' + ' b. View Remote Fee - View the fee policy on the channel of the remote peer.\n' +
' c. Update Fee Policy - Modify the fee policy on the channel.\n' + ' c. Update Fee Policy - Modify the fee policy on the channel.\n' +
' d. Close Channel - Close the channel.\n' + ' d. Circular Rebalance - Off-chain rebalance channels by making a payment to yourself across a circular path of chained payment channels.\n' +
' e. Close Channel - Close the channel.\n' +
'2. Balance Score is a "balancedness" metric score for the channel. \n' + '2. Balance Score is a "balancedness" metric score for the channel. \n' +
' a. It helps measure how balanced the remote and local balances are, on a channel.\n' + ' a. It helps measure how balanced the remote and local balances are, on a channel.\n' +
' b. A perfectly balanced channel has a score of one, where as a completely lopsided one has a score of zero.\n' + ' b. A perfectly balanced channel has a score of one, where as a completely lopsided one has a score of zero.\n' +
' c. The formula for calculating the score is "1 - abs((local bal - remote bal)/total bal)".\n', ' c. The formula for calculating the score is "1 - abs((local bal - remote bal)/total bal)".\n',
link: 'peerschannels', link: this.LNPLink + 'connections/channels/open',
linkCaption: 'Peers/Channels page', linkCaption: 'Channels',
lnImplementation: 'ALL' lnImplementation: 'ALL'
})); }));
this.helpTopics.push(new HelpTopic({ this.helpTopics.push(new HelpTopic({
question: 'Lightning Transactions - Payments', question: 'Buying Liquidity',
answer: 'Buying liquidity for your node.\n' +
'Go to "Liquidity Ads" page under the "Lightning" menu:\n' +
' 1. Filter ads by liquidity amount and channel opening fee rate.\n' +
' 2. Research additionally on liquidity provider nodes before selecting.\n' +
' 3. Select the best liquidity node peer for your need and click on "Open Channel" from "Actions" drop-down.\n' +
' 4. Confirm amount, rates and total cost on the modal and click on "Execute" to buy liquidity.\n',
link: this.LNPLink + 'liquidityads',
linkCaption: 'Liquidity Ads',
lnImplementation: 'CLN'
}));
this.helpTopics.push(new HelpTopic({
question: 'Payments',
answer: 'Sending Payments from your node.\n' + answer: 'Sending Payments from your node.\n' +
'Go to the "Transactions" page under the "Lightning" menu :\n' + 'Go to the "Transactions" page under the "Lightning" menu :\n' +
'Payments tab is for making payments via your node\n' + 'Payments tab is for making payments via your node\n' +
' 1. Input a non-expired lightning invoice (Bolt11 format) in the "Payment request" field and click on "Send Payment" to send.\n' + ' 1. Input a non-expired lightning invoice (Bolt11 format) in the "Payment Request" field and click on "Send Payment" to send.\n' +
' 2. Advanced option # 1 (LND only) - Specify a limit on the routing fee which you are willing to pay, for the payment.\n' + ' 2. Advanced option # 1 (LND only) - Specify a limit on the routing fee which you are willing to pay, for the payment.\n' +
' 3. Advanced option # 2 (LND only) - Specify the outgoing channel which you want the payment to go through.\n', ' 3. Advanced option # 2 (LND only) - Specify the outgoing channel which you want the payment to go through.\n',
link: 'transactions', link: this.LNPLink + 'transactions/payments',
linkCaption: 'Transactions page', linkCaption: 'Payments',
lnImplementation: 'ALL' lnImplementation: 'ALL'
})); }));
this.helpTopics.push(new HelpTopic({ this.helpTopics.push(new HelpTopic({
question: 'Lightning Transactions - Invoices', question: 'Invoices',
answer: 'Receiving Payments on your node.\n' + answer: 'Receiving Payments on your node.\n' +
'Go to the "Transactions" page under the "Lightning" menu :\n' + 'Go to the "Transactions" page under the "Lightning" menu :\n' +
'Invoices tab is for receiving payments on your node.\n' + 'Invoices tab is for receiving payments on your node.\n' +
' 1. Memo - Description you want to provide on the invoice.\n' + ' 1. Memo - Description you want to provide on the invoice.\n' +
' 2. Expiry - The time period, after which the invoice will be invalid.\n' + ' 2. Expiry - The time period, after which the invoice will be invalid.\n' +
' 3. Private Routing Hints - Generate an invoice with routing hints for private channels.\n', ' 3. Private Routing Hints - Generate an invoice with routing hints for private channels.\n',
link: 'transactions', link: this.LNPLink + 'transactions/invoices',
linkCaption: 'Transactions page', linkCaption: 'Invoices',
lnImplementation: 'ALL' lnImplementation: 'ALL'
})); }));
this.helpTopics.push(new HelpTopic({ this.helpTopics.push(new HelpTopic({
question: 'Lightning Transactions - Query Route', question: 'Offers',
answer: 'Querying Payment Routes.\n' + answer: 'Send offer payments, create offer invoices and bookmark paid offers on your node.\n' +
'Go to the "Transactions" page under the "Lightning" menu :\n' + 'Go to the "Transactions" page under the "Lightning" menu :\n' +
'Query Routes tab is for querying a potential path to a node and a routing fee estimate for a payment amount.\n' + 'Payment for bolt12 offer invoice can be done on "Payments" tab:\n' +
' 1. Destination Pubkey - Pubkey of the node, you want to send the payment to.\n' + ' 1. Click on "Send Payment" button.\n' +
' 2. Amount - Amount in Sats, which you want to send to the node.\n', ' 2. Select "Offer" option on the modal.\n' +
link: 'transactions', ' 2. Offer Request - Input offer request (Bolt12 format) in the input box.\n' +
linkCaption: 'Transactions page', ' 3. Bookmark - Select the checkbox to bookmark this offer for future use.\n' +
lnImplementation: 'ALL' 'Offers tab is for creating bolt12 offer invoice on your node:\n' +
' 1. Click on "Create Offer" button.\n' +
' 2. Description - Description you want to provide on the offer invoice.\n' +
' 3. Amount - Amount for the offer invoice.\n' +
' 4. Vendor - Vendor of the offer.\n' +
'Paid offer bookmarks shows the list of paid offers saved for future payments.\n',
link: this.LNPLink + 'transactions/offers',
linkCaption: 'Offers',
lnImplementation: 'CLN'
})); }));
this.helpTopics.push(new HelpTopic({ this.helpTopics.push(new HelpTopic({
question: 'Channel Backups', question: 'Channel Backups',
@ -128,7 +171,7 @@ export class HelpComponent implements OnInit, OnDestroy {
'You can verify the all channel backup file by clicking on "Verify All" Button on the backup page.\n' + 'You can verify the all channel backup file by clicking on "Verify All" Button on the backup page.\n' +
'You can also backup each channel individually and verify them.\n' + 'You can also backup each channel individually and verify them.\n' +
'** Keep taking backups of your channels regularly and store them in redundant locations **.\n', '** Keep taking backups of your channels regularly and store them in redundant locations **.\n',
link: 'backup', link: this.LNPLink + 'channelbackup/bckup',
linkCaption: 'Channel Backups', linkCaption: 'Channel Backups',
lnImplementation: 'LND' lnImplementation: 'LND'
})); }));
@ -150,8 +193,8 @@ export class HelpComponent implements OnInit, OnDestroy {
'8. The pending close channels can be viewed under the "Pending" tab on the "Peer/Channels" page.\n' + '8. The pending close channels can be viewed under the "Pending" tab on the "Peer/Channels" page.\n' +
'9. Once the channel is closed, the corresponding pending on-chain transactions can be viewed on the "On-Chain" page.\n' + '9. Once the channel is closed, the corresponding pending on-chain transactions can be viewed on the "On-Chain" page.\n' +
'10. Once the transactions are confirmed, the channels funds will be restored to your LND Wallet.\n', '10. Once the transactions are confirmed, the channels funds will be restored to your LND Wallet.\n',
link: 'backup', link: this.LNPLink + 'channelbackup/restore',
linkCaption: 'Channel Backups', linkCaption: 'Channel Restore',
lnImplementation: 'LND' lnImplementation: 'LND'
})); }));
this.helpTopics.push(new HelpTopic({ this.helpTopics.push(new HelpTopic({
@ -159,10 +202,19 @@ export class HelpComponent implements OnInit, OnDestroy {
answer: 'Transactions routed by the node.\n' + answer: 'Transactions routed by the node.\n' +
'Go to "Routing" page under the "Lightning" menu :\n' + 'Go to "Routing" page under the "Lightning" menu :\n' +
'Transactions routed by the node are listed on this page along with channels and the fee earned by transaction.\n', 'Transactions routed by the node are listed on this page along with channels and the fee earned by transaction.\n',
link: 'routing', link: this.LNPLink + 'routing/forwardinghistory',
linkCaption: 'Forwarding History', linkCaption: 'Forwarding History',
lnImplementation: 'ALL' lnImplementation: 'ALL'
})); }));
this.helpTopics.push(new HelpTopic({
question: 'Lightning Reports',
answer: 'Routing and transactions data reports.\n' +
'Go to "Reports" page under the "Lightning" menu :\n' +
'Report can be generated on monthly/yearly basis by selecting the reporting period, month, and year.\n',
link: this.LNPLink + 'reports/routingreport',
linkCaption: 'Reports',
lnImplementation: 'ALL'
}));
this.helpTopics.push(new HelpTopic({ this.helpTopics.push(new HelpTopic({
question: 'Graph Lookup', question: 'Graph Lookup',
answer: 'Querying your node graph for network node and channel information.\n' + answer: 'Querying your node graph for network node and channel information.\n' +
@ -171,48 +223,73 @@ export class HelpComponent implements OnInit, OnDestroy {
'You can lookup information on nodes and channels from your graph:\n' + 'You can lookup information on nodes and channels from your graph:\n' +
' 1. Node Lookup - Enter the pubkey to perform the lookup.\n' + ' 1. Node Lookup - Enter the pubkey to perform the lookup.\n' +
' 2. Channel Lookup - Enter the short channel ID to perform the lookup.\n', ' 2. Channel Lookup - Enter the short channel ID to perform the lookup.\n',
link: 'lookups', link: this.LNPLink + 'graph/lookups',
linkCaption: 'Graph Lookup page', linkCaption: 'Graph Lookup',
lnImplementation: 'ALL' lnImplementation: 'ALL'
})); }));
this.helpTopics.push(new HelpTopic({ this.helpTopics.push(new HelpTopic({
question: 'Settings', question: 'Query Route',
answer: 'RTL Offers certain customizations on the UI to personalize your experience on the app\n' + answer: 'Querying Payment Routes.\n' +
'Go to "Settings" page to access the customization options.\n' + 'Go to the "Graph Lookup" page under the "Lightning" menu :\n' +
'Query Routes tab is for querying a potential path to a node and a routing fee estimate for a payment amount.\n' +
' 1. Destination Pubkey - Pubkey of the node, you want to send the payment to.\n' +
' 2. Amount - Amount in Sats, which you want to send to the node.\n',
link: this.LNPLink + 'graph/queryroutes',
linkCaption: 'Query Routes',
lnImplementation: 'ALL'
}));
this.helpTopics.push(new HelpTopic({
question: 'Sign & Verify Messages',
answer: 'Messages signing and verification.\n' +
'Go to the "Sign/Verify" page under the "Lightning" menu :\n' +
' 1. Sign your message on "Sign" tab.\n' +
' 2. Go to "Verify" tab to verify a message.\n',
link: this.LNPLink + 'messages/sign',
linkCaption: 'Messages',
lnImplementation: 'LND'
}));
this.helpTopics.push(new HelpTopic({
question: 'Sign & Verify Messages',
answer: 'Messages signing and verification.\n' +
'Go to the "Sign/Verify" page under the "Lightning" menu :\n' +
' 1. Sign your message on "Sign" tab.\n' +
' 2. Go to "Verify" tab to verify a message.\n',
link: this.LNPLink + 'messages/sign',
linkCaption: 'Messages',
lnImplementation: 'CLN'
}));
this.helpTopics.push(new HelpTopic({
question: 'Node Settings',
answer: 'RTL offers certain customizations on the UI to personalize your experience on the app\n' +
'Go to "Node Config" page to access the customization options.\n' +
'Node Layout Options\n' + 'Node Layout Options\n' +
' 1. User Persona - Two options are available to change the dashboard based on the persona.\n' + ' 1. User Persona - Two options are available to change the dashboard based on the persona.\n' +
' 2. Currency Unit - You can choose your preferred fiat currency, to view the onchain and channel balances in the choosen fiat currency.\n' + ' 2. Currency Unit - You can choose your preferred fiat currency, to view the onchain and channel balances in the choosen fiat currency.\n' +
' 3. Default Node - If you are managing multiple nodes via RTL UI, you can select the default node to load upon login.\n' + ' 3. Other customizations include day and night mode and a choice of color themes to select from.\n' +
'Other Customizations include day and night mode and a choice of color themes to select from.\n', 'Services Options\n' +
' Loop (LND only), Boltz (LND only) & Peerswap (CLN only) services can be configured.\n' +
'Experimental Options (CLN only)\n' +
' Offers and Liquidity Ads can be enabled/disabled.\n' +
'Show LN Config (if configured)\n' +
' Shows lightning config file.\n',
link: '../config/layout',
linkCaption: 'Node Settings',
lnImplementation: 'ALL'
}));
this.helpTopics.push(new HelpTopic({
question: 'Application Settings',
answer: 'RTL also offers certain customizations on the application level\n' +
'Go to top right menu "Settings" page to access these options.\n' +
'Default Node Option\n' +
'If you are managing multiple nodes via RTL UI, you can select the default node to load upon login.\n' +
'Authentication Option\n' +
'Password and 2FA update options are available here.\n' +
'Show Bitcoin Config (if configured)\n' +
' Shows bitcoin config file.\n',
link: '../settings/app',
linkCaption: 'Application Settings',
lnImplementation: 'ALL' lnImplementation: 'ALL'
})); }));
}
ngOnInit() {
this.store.select(rootSelectedNode).pipe(takeUntil(this.unSubs[0])).subscribe((selNode) => {
this.selNode = selNode;
switch (this.selNode.lnImplementation?.toUpperCase()) {
case 'CLN':
this.LNPLink = '/cln/';
break;
case 'ECL':
this.LNPLink = '/ecl/';
break;
default:
this.LNPLink = '/lnd/';
break;
}
});
this.sessionService.watchSession().
pipe(takeUntil(this.unSubs[1])).
subscribe((session) => {
this.flgLoggedIn = !!session.token;
});
if (this.sessionService.getItem('token')) {
this.flgLoggedIn = true;
}
} }
ngOnDestroy() { ngOnDestroy() {

@ -115,7 +115,7 @@ export class ExperimentalSettingsComponent implements OnInit, OnDestroy {
onUpdateFundingPolicy() { onUpdateFundingPolicy() {
this.flgUpdateCalled = true; this.flgUpdateCalled = true;
this.updateMsg = {}; this.updateMsg = {};
this.dataService.getOrUpdateFunderPolicy(this.selPolicyType.id, this.policyMod, this.leaseFeeBaseSat, this.leaseFeeBasis, (this.channelFeeMaxBaseSat || 0) * 1000, this.channelFeeMaxProportional ? this.channelFeeMaxProportional / 1000 : 0). this.dataService.getOrUpdateFunderPolicy(this.selPolicyType.id, this.policyMod, ((this.leaseFeeBaseSat || 0) * 1000), this.leaseFeeBasis, (this.channelFeeMaxBaseSat || 0) * 1000, this.channelFeeMaxProportional ? this.channelFeeMaxProportional / 1000 : 0).
pipe(takeUntil(this.unSubs[4])). pipe(takeUntil(this.unSubs[4])).
subscribe({ subscribe({
next: (updatePolicyRes: any) => { next: (updatePolicyRes: any) => {

@ -16,7 +16,6 @@ import { fetchConfig } from '../../../../store/rtl.actions';
}) })
export class LNPConfigComponent implements OnInit, OnDestroy { export class LNPConfigComponent implements OnInit, OnDestroy {
public selectedNodeType = '';
public configData = ''; public configData = '';
public fileFormat = 'INI'; public fileFormat = 'INI';
public faCog = faCog; public faCog = faCog;
@ -25,14 +24,7 @@ export class LNPConfigComponent implements OnInit, OnDestroy {
constructor(private store: Store<RTLState>, private rtlEffects: RTLEffects, private router: Router) { } constructor(private store: Store<RTLState>, private rtlEffects: RTLEffects, private router: Router) { }
ngOnInit() { ngOnInit() {
this.selectedNodeType = (this.router.url.includes('bconfig')) ? 'bitcoind' : 'ln'; this.store.dispatch(fetchConfig({ payload: 'ln' }));
this.router.events.pipe(takeUntil(this.unSubs[0]), filter((e) => e instanceof ResolveEnd)).
subscribe({
next: (value: ResolveEnd | Event) => {
this.selectedNodeType = ((<ResolveEnd>value).urlAfterRedirects.includes('bconfig')) ? 'bitcoind' : 'ln';
}
});
this.store.dispatch(fetchConfig({ payload: this.selectedNodeType }));
this.rtlEffects.showLnConfig. this.rtlEffects.showLnConfig.
pipe(takeUntil(this.unSubs[1])). pipe(takeUntil(this.unSubs[1])).
subscribe((config: any) => { subscribe((config: any) => {

@ -7,7 +7,8 @@
<mat-card-content fxLayout="column"> <mat-card-content fxLayout="column">
<nav mat-tab-nav-bar> <nav mat-tab-nav-bar>
<div role="tab" mat-tab-link class="mat-tab-label" [active]="activeLink === links[0].link" (click)="activeLink = links[0].link" routerLink="{{links[0].link}}">{{links[0].name}}</div> <div role="tab" mat-tab-link class="mat-tab-label" [active]="activeLink === links[0].link" (click)="activeLink = links[0].link" routerLink="{{links[0].link}}">{{links[0].name}}</div>
<div role="tab" mat-tab-link *ngIf="selNode?.lnImplementation?.toUpperCase() === 'LND' || selNode?.lnImplementation?.toUpperCase() === 'CLN'" class="mat-tab-label" [active]="activeLink === links[1].link" (click)="activeLink = links[1].link" routerLink="{{links[1].link}}" [state]="{ initial: false }">{{links[1].name}}</div> <!-- <div role="tab" mat-tab-link *ngIf="selNode?.lnImplementation?.toUpperCase() === 'LND' || selNode?.lnImplementation?.toUpperCase() === 'CLN'" class="mat-tab-label" [active]="activeLink === links[1].link" (click)="activeLink = links[1].link" routerLink="{{links[1].link}}" [state]="{ initial: false }">{{links[1].name}}</div> -->
<div role="tab" mat-tab-link *ngIf="selNode?.lnImplementation?.toUpperCase() === 'LND'" class="mat-tab-label" [active]="activeLink === links[1].link" (click)="activeLink = links[1].link" routerLink="{{links[1].link}}" [state]="{ initial: false }">{{links[1].name}}</div>
<div role="tab" mat-tab-link *ngIf="selNode?.lnImplementation?.toUpperCase() === 'CLN'" class="mat-tab-label" [active]="activeLink === links[2].link" (click)="activeLink = links[2].link" routerLink="{{links[2].link}}">{{links[2].name}}</div> <div role="tab" mat-tab-link *ngIf="selNode?.lnImplementation?.toUpperCase() === 'CLN'" class="mat-tab-label" [active]="activeLink === links[2].link" (click)="activeLink = links[2].link" routerLink="{{links[2].link}}">{{links[2].name}}</div>
<div role="tab" mat-tab-link *ngIf="showLnConfig" class="mat-tab-label" [active]="activeLink === links[3].link" (click)="showLnConfigClicked()">{{links[3].name}}</div> <div role="tab" mat-tab-link *ngIf="showLnConfig" class="mat-tab-label" [active]="activeLink === links[3].link" (click)="showLnConfigClicked()">{{links[3].name}}</div>
</nav> </nav>

@ -16,7 +16,6 @@ import { fetchConfig } from '../../../../store/rtl.actions';
}) })
export class BitcoinConfigComponent implements OnInit, OnDestroy { export class BitcoinConfigComponent implements OnInit, OnDestroy {
public selectedNodeType = '';
public configData = ''; public configData = '';
public fileFormat = 'INI'; public fileFormat = 'INI';
public faCog = faCog; public faCog = faCog;
@ -25,14 +24,7 @@ export class BitcoinConfigComponent implements OnInit, OnDestroy {
constructor(private store: Store<RTLState>, private rtlEffects: RTLEffects, private router: Router) { } constructor(private store: Store<RTLState>, private rtlEffects: RTLEffects, private router: Router) { }
ngOnInit() { ngOnInit() {
this.selectedNodeType = (this.router.url.includes('bconfig')) ? 'bitcoind' : 'ln'; this.store.dispatch(fetchConfig({ payload: 'bitcoind' }));
this.router.events.pipe(takeUntil(this.unSubs[0]), filter((e) => e instanceof ResolveEnd)).
subscribe({
next: (value: ResolveEnd | Event) => {
this.selectedNodeType = ((<ResolveEnd>value).urlAfterRedirects.includes('bconfig')) ? 'bitcoind' : 'ln';
}
});
this.store.dispatch(fetchConfig({ payload: this.selectedNodeType }));
this.rtlEffects.showLnConfig. this.rtlEffects.showLnConfig.
pipe(takeUntil(this.unSubs[1])). pipe(takeUntil(this.unSubs[1])).
subscribe((config: any) => { subscribe((config: any) => {

@ -550,13 +550,10 @@ export class RTLEffects implements OnDestroy {
initializeNode(node: ConfigSettingsNode, isInitialSetup: boolean) { initializeNode(node: ConfigSettingsNode, isInitialSetup: boolean) {
this.logger.info('Initializing node from RTL Effects.'); this.logger.info('Initializing node from RTL Effects.');
const landingPage = isInitialSetup ? '' : 'HOME'; const landingPage = isInitialSetup ? '' : 'HOME';
let selNode = {}; const selNode = { userPersona: node.settings.userPersona, channelBackupPath: node.settings.channelBackupPath, selCurrencyUnit: node.settings.currencyUnit,
currencyUnits: CURRENCY_UNITS, fiatConversion: node.settings.fiatConversion, lnImplementation: node.lnImplementation, swapServerUrl: node.settings.swapServerUrl, boltzServerUrl: node.settings.boltzServerUrl, enableOffers: node.settings.enableOffers, enablePeerswap: node.settings.enablePeerswap };
if (node.settings.fiatConversion && node.settings.currencyUnit) { if (node.settings.fiatConversion && node.settings.currencyUnit) {
selNode = { userPersona: node.settings.userPersona, channelBackupPath: node.settings.channelBackupPath, selCurrencyUnit: node.settings.currencyUnit, selNode['currencyUnits'] = [...CURRENCY_UNITS, node.settings.currencyUnit];
currencyUnits: [...CURRENCY_UNITS, node.settings.currencyUnit], fiatConversion: node.settings.fiatConversion, lnImplementation: node.lnImplementation, swapServerUrl: node.settings.swapServerUrl, boltzServerUrl: node.settings.boltzServerUrl, enableOffers: node.settings.enableOffers, enablePeerswap: node.settings.enablePeerswap };
} else {
selNode = { userPersona: node.settings.userPersona, channelBackupPath: node.settings.channelBackupPath, selCurrencyUnit: node.settings.currencyUnit,
currencyUnits: CURRENCY_UNITS, fiatConversion: node.settings.fiatConversion, lnImplementation: node.lnImplementation, swapServerUrl: node.settings.swapServerUrl, boltzServerUrl: node.settings.boltzServerUrl, enableOffers: node.settings.enableOffers, enablePeerswap: node.settings.enablePeerswap };
} }
this.sessionService.removeItem('lndUnlocked'); this.sessionService.removeItem('lndUnlocked');
this.sessionService.removeItem('clUnlocked'); this.sessionService.removeItem('clUnlocked');

Loading…
Cancel
Save