diff --git a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.scss b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.scss
index 578bffc3a..ca887ad13 100644
--- a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.scss
+++ b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.scss
@@ -29,6 +29,18 @@
min-height: 250px;
}
+.full-container.fit-container {
+ margin: 0;
+ padding: 0;
+ height: 100%;
+ min-height: 100px;
+
+ .chart {
+ padding: 0;
+ min-height: 100px;
+ }
+}
+
.widget {
width: 90vw;
margin-left: auto;
diff --git a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts
index d8952d632..033f944b1 100644
--- a/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts
+++ b/frontend/src/app/lightning/nodes-channels-map/nodes-channels-map.component.ts
@@ -1,4 +1,4 @@
-import { ChangeDetectionStrategy, Component, HostListener, Input, NgZone, OnDestroy, OnInit, ViewChild } from '@angular/core';
+import { ChangeDetectionStrategy, Component, HostListener, Input, Output, EventEmitter, NgZone, OnDestroy, OnInit, ViewChild } from '@angular/core';
import { SeoService } from 'src/app/services/seo.service';
import { ApiService } from 'src/app/services/api.service';
import { Observable, switchMap, tap, zip } from 'rxjs';
@@ -20,9 +20,11 @@ export class NodesChannelsMap implements OnInit, OnDestroy {
@Input() style: 'graph' | 'nodepage' | 'widget' | 'channelpage' = 'graph';
@Input() publicKey: string | undefined;
@Input() channel: any[] = [];
+ @Input() fitContainer = false;
+ @Output() readyEvent = new EventEmitter();
observable$: Observable
;
-
+
center: number[] | undefined;
zoom: number | undefined;
channelWidth = 0.6;
@@ -313,4 +315,8 @@ export class NodesChannelsMap implements OnInit, OnDestroy {
this.chartInstance.setOption(chartOptions);
});
}
+
+ onChartFinished(e) {
+ this.readyEvent.emit();
+ }
}
diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts
index 0d0b05556..466837f98 100644
--- a/frontend/src/app/services/state.service.ts
+++ b/frontend/src/app/services/state.service.ts
@@ -71,11 +71,13 @@ const defaultEnv: Env = {
export class StateService {
isBrowser: boolean = isPlatformBrowser(this.platformId);
network = '';
+ lightning = false;
blockVSize: number;
env: Env;
latestBlockHeight = -1;
networkChanged$ = new ReplaySubject(1);
+ lightningChanged$ = new ReplaySubject(1);
blocks$: ReplaySubject<[BlockExtended, boolean]>;
transactions$ = new ReplaySubject(6);
conversions$ = new ReplaySubject(1);
@@ -122,15 +124,18 @@ export class StateService {
if (this.isBrowser) {
this.setNetworkBasedonUrl(window.location.pathname);
+ this.setLightningBasedonUrl(window.location.pathname);
this.isTabHidden$ = fromEvent(document, 'visibilitychange').pipe(map(() => this.isHidden()), shareReplay());
} else {
this.setNetworkBasedonUrl('/');
+ this.setLightningBasedonUrl('/');
this.isTabHidden$ = new BehaviorSubject(false);
}
this.router.events.subscribe((event) => {
if (event instanceof NavigationStart) {
this.setNetworkBasedonUrl(event.url);
+ this.setLightningBasedonUrl(event.url);
}
});
@@ -198,6 +203,15 @@ export class StateService {
}
}
+ setLightningBasedonUrl(url: string) {
+ if (this.env.BASE_MODULE !== 'mempool') {
+ return;
+ }
+ const networkMatches = url.match(/\/lightning\//);
+ this.lightning = !!networkMatches;
+ this.lightningChanged$.next(this.lightning);
+ }
+
getHiddenProp(){
const prefixes = ['webkit', 'moz', 'ms', 'o'];
if ('hidden' in document) { return 'hidden'; }
diff --git a/frontend/src/app/shared/shared.module.ts b/frontend/src/app/shared/shared.module.ts
index ce131bb02..48e9eb46e 100644
--- a/frontend/src/app/shared/shared.module.ts
+++ b/frontend/src/app/shared/shared.module.ts
@@ -4,7 +4,7 @@ import { NgbCollapse, NgbCollapseModule, NgbRadioGroup, NgbTypeaheadModule } fro
import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontawesome';
import { faFilter, faAngleDown, faAngleUp, faAngleRight, faAngleLeft, faBolt, faChartArea, faCogs, faCubes, faHammer, faDatabase, faExchangeAlt, faInfoCircle,
faLink, faList, faSearch, faCaretUp, faCaretDown, faTachometerAlt, faThList, faTint, faTv, faAngleDoubleDown, faSortUp, faAngleDoubleUp, faChevronDown,
- faFileAlt, faRedoAlt, faArrowAltCircleRight, faExternalLinkAlt, faBook, faListUl, faDownload, faQrcode } from '@fortawesome/free-solid-svg-icons';
+ faFileAlt, faRedoAlt, faArrowAltCircleRight, faExternalLinkAlt, faBook, faListUl, faDownload, faQrcode, faArrowRightArrowLeft } from '@fortawesome/free-solid-svg-icons';
import { InfiniteScrollModule } from 'ngx-infinite-scroll';
import { MasterPageComponent } from '../components/master-page/master-page.component';
import { MasterPagePreviewComponent } from '../components/master-page-preview/master-page-preview.component';
@@ -297,5 +297,6 @@ export class SharedModule {
library.addIcons(faListUl);
library.addIcons(faDownload);
library.addIcons(faQrcode);
+ library.addIcons(faArrowRightArrowLeft);
}
}
diff --git a/unfurler/src/index.ts b/unfurler/src/index.ts
index ca85ae5cc..cd6b7762f 100644
--- a/unfurler/src/index.ts
+++ b/unfurler/src/index.ts
@@ -150,12 +150,27 @@ class Server {
}
// handle supported preview routes
- if (parts[0] === 'block') {
- ogTitle = `Block: ${parts[1]}`;
- } else if (parts[0] === 'address') {
- ogTitle = `Address: ${parts[1]}`;
- } else {
- previewSupported = false;
+ switch (parts[0]) {
+ case 'block':
+ ogTitle = `Block: ${parts[1]}`;
+ break;
+ case 'address':
+ ogTitle = `Address: ${parts[1]}`;
+ break;
+ case 'lightning':
+ switch (parts[1]) {
+ case 'node':
+ ogTitle = `Lightning Node: ${parts[2]}`;
+ break;
+ case 'channel':
+ ogTitle = `Lightning Channel: ${parts[2]}`;
+ break;
+ default:
+ previewSupported = false;
+ }
+ break;
+ default:
+ previewSupported = false;
}
if (previewSupported) {