113 lines
3.5 KiB
TypeScript
113 lines
3.5 KiB
TypeScript
import { Component, computed, inject, input } from '@angular/core';
|
|
import { MatDividerModule } from '@angular/material/divider';
|
|
import { MatIcon } from '@angular/material/icon';
|
|
import { MatListModule } from '@angular/material/list';
|
|
import { MatTooltip } from '@angular/material/tooltip';
|
|
import { ActivatedRoute, RouterLink, RouterLinkActive } from '@angular/router';
|
|
import { Store } from '@ngrx/store';
|
|
import { TranslatePipe } from '@ngx-translate/core';
|
|
import {
|
|
buildPortalRailLinks,
|
|
PORTAL_NAVIGATION_ACTIONS,
|
|
PortalRailSection,
|
|
} from '@iptvnator/portal/shared/util';
|
|
import { selectPlaylistById } from 'm3u-state';
|
|
import { Playlist } from 'shared-interfaces';
|
|
import { PortalRailLinksComponent } from './portal-rail-links.component';
|
|
|
|
@Component({
|
|
selector: 'app-navigation',
|
|
imports: [
|
|
MatDividerModule,
|
|
MatIcon,
|
|
MatListModule,
|
|
MatTooltip,
|
|
RouterLink,
|
|
RouterLinkActive,
|
|
TranslatePipe,
|
|
PortalRailLinksComponent,
|
|
],
|
|
templateUrl: './navigation.component.html',
|
|
styleUrl: './navigation.component.scss',
|
|
})
|
|
export class NavigationComponent {
|
|
private readonly activatedRoute = inject(ActivatedRoute);
|
|
private readonly navigationActions = inject(PORTAL_NAVIGATION_ACTIONS);
|
|
private readonly store = inject(Store);
|
|
|
|
readonly portalStatus = input<
|
|
'active' | 'inactive' | 'expired' | 'unavailable'
|
|
>();
|
|
readonly selectedContentType = input<PortalRailSection | undefined>();
|
|
|
|
readonly currentPlaylist = this.store.selectSignal(
|
|
selectPlaylistById(this.activatedRoute.snapshot.params.id)
|
|
);
|
|
|
|
readonly isStalkerPlaylist = computed(
|
|
() => !!(this.currentPlaylist() as Playlist | undefined)?.macAddress
|
|
);
|
|
|
|
readonly isElectron = !!window.electron;
|
|
|
|
readonly railLinks = computed(() => {
|
|
const playlistId =
|
|
(this.currentPlaylist() as Playlist | undefined)?._id ??
|
|
this.activatedRoute.snapshot.params['id'];
|
|
if (!playlistId) {
|
|
return { primary: [], secondary: [] };
|
|
}
|
|
|
|
return buildPortalRailLinks({
|
|
provider: this.isStalkerPlaylist() ? 'stalker' : 'xtreams',
|
|
playlistId,
|
|
isElectron: this.isElectron,
|
|
workspace: false,
|
|
});
|
|
});
|
|
readonly primaryLinks = computed(() => this.railLinks().primary);
|
|
readonly secondaryLinks = computed(() => this.railLinks().secondary);
|
|
|
|
getStatusColor(): string {
|
|
if (this.isStalkerPlaylist()) return 'status-active';
|
|
|
|
switch (this.portalStatus()) {
|
|
case 'active':
|
|
return 'status-active';
|
|
case 'inactive':
|
|
return 'status-inactive';
|
|
case 'expired':
|
|
return 'status-expired';
|
|
default:
|
|
return 'status-unavailable';
|
|
}
|
|
}
|
|
|
|
getStatusIcon(): string {
|
|
if (this.isStalkerPlaylist()) return 'play_circle';
|
|
|
|
switch (this.portalStatus()) {
|
|
case 'active':
|
|
return 'check_circle';
|
|
case 'inactive':
|
|
return 'cancel';
|
|
case 'expired':
|
|
return 'warning';
|
|
default:
|
|
return 'error';
|
|
}
|
|
}
|
|
|
|
openAccountInfo(): void {
|
|
this.navigationActions.openAccountInfo();
|
|
}
|
|
|
|
openSettings(): void {
|
|
this.navigationActions.openSettings();
|
|
}
|
|
|
|
openPlaylistInfo(): void {
|
|
this.navigationActions.openPlaylistInfo(this.currentPlaylist());
|
|
}
|
|
}
|