From 260f3b3da7206e5784dcc6b6f2a029ac17e9798e Mon Sep 17 00:00:00 2001 From: 4gray Date: Tue, 14 Oct 2025 09:00:31 +0200 Subject: [PATCH] refactor(nx): app restructuring --- apps/web/src/app/app-routing.module.ts | 12 ++++-- apps/web/src/app/app.component.ts | 3 +- apps/web/src/app/home/home.component.ts | 2 +- .../stalker-portal-import.component.ts | 2 +- .../video-player/video-player.component.html | 1 + .../video-player/video-player.component.scss | 0 .../video-player.component.spec.ts | 18 ++++----- .../video-player/video-player.component.ts | 39 ++++++++++++------- .../xtream-code-import.component.ts | 5 +-- apps/web/src/app/services/player.service.ts | 2 +- apps/web/src/app/services/pwa.service.ts | 2 +- .../app/services/settings-store.service.ts | 10 ++--- apps/web/src/app/services/settings.service.ts | 17 ++++---- .../app/settings/settings.component.spec.ts | 2 +- .../src/app/settings/settings.component.ts | 6 +-- .../add-playlist-dialog.component.ts | 2 +- .../grid-list/grid-list.component.ts | 2 + .../recently-viewed.component.ts | 2 +- .../stalker-favorites.component.ts | 2 +- .../stalker-main-container.component.ts | 2 +- .../account-info/account-info.component.ts | 8 ++-- .../playlist-error-view.component.ts | 4 +- .../search-results.component.ts | 4 +- .../services/favorites.service.ts | 2 +- .../xtream-tauri/with-favorites.feature.ts | 2 +- .../src/app/xtream-tauri/with-recent-items.ts | 2 +- .../category-content-view.component.ts | 2 +- .../playlist-error-view.component.ts | 15 ++++--- apps/web/tsconfig.spec.json | 2 +- libs/services/src/index.ts | 1 - libs/shared/interfaces/src/index.ts | 3 ++ .../shared/interfaces/src/lib}/global.d.ts | 12 +++++- libs/shared/interfaces/src/lib/tokens.ts | 5 +++ .../src/lib/xtream-live-stream.interface.ts | 2 +- .../src/lib/xtream-vod-stream.interface.ts | 2 +- libs/ui/components/src/index.ts | 2 +- .../confirm-dialog}/dialog.service.spec.ts | 2 +- .../src/lib/confirm-dialog}/dialog.service.ts | 5 ++- .../epg-item-description.component.ts | 10 +++-- .../epg-list-item/epg-list-item.component.ts | 20 ++++------ .../src/lib/epg-list/epg-list.component.ts | 5 +-- .../info-overlay/info-overlay.component.ts | 14 +++---- .../multi-epg-container.component.ts | 14 ++++--- .../recent-playlists.component.spec.ts | 2 +- .../recent-playlists.component.ts | 8 +--- .../video-player/sidebar/sidebar.component.ts | 2 +- .../toolbar/toolbar.component.html | 2 +- .../video-player/toolbar/toolbar.component.ts | 21 +++------- .../lib/vjs-player/vjs-player.component.ts | 16 ++++---- libs/ui/components/tsconfig.lib.json | 6 ++- libs/ui/pipes/src/index.ts | 1 - libs/ui/pipes/src/lib/filter-by-type.pipe.ts | 13 ------- 52 files changed, 171 insertions(+), 169 deletions(-) rename {libs/ui/components/src/lib => apps/web/src/app/home}/video-player/video-player.component.html (98%) rename {libs/ui/components/src/lib => apps/web/src/app/home}/video-player/video-player.component.scss (100%) rename {libs/ui/components/src/lib => apps/web/src/app/home}/video-player/video-player.component.spec.ts (78%) rename {libs/ui/components/src/lib => apps/web/src/app/home}/video-player/video-player.component.ts (91%) rename {apps/web/src => libs/shared/interfaces/src/lib}/global.d.ts (66%) create mode 100644 libs/shared/interfaces/src/lib/tokens.ts rename libs/{services/src/lib => ui/components/src/lib/confirm-dialog}/dialog.service.spec.ts (91%) rename libs/{services/src/lib => ui/components/src/lib/confirm-dialog}/dialog.service.ts (87%) delete mode 100644 libs/ui/pipes/src/lib/filter-by-type.pipe.ts diff --git a/apps/web/src/app/app-routing.module.ts b/apps/web/src/app/app-routing.module.ts index 4d41d63b7..291d850a7 100644 --- a/apps/web/src/app/app-routing.module.ts +++ b/apps/web/src/app/app-routing.module.ts @@ -13,17 +13,23 @@ const routes: Routes = [ { path: 'playlists', loadComponent: () => - import('components').then((c) => c.VideoPlayerComponent), + import('./home/video-player/video-player.component').then( + (c) => c.VideoPlayerComponent + ), }, { path: 'iptv', loadComponent: () => - import('components').then((c) => c.VideoPlayerComponent), + import('./home/video-player/video-player.component').then( + (c) => c.VideoPlayerComponent + ), }, { path: 'playlists/:id', loadComponent: () => - import('components').then((c) => c.VideoPlayerComponent), + import('./home/video-player/video-player.component').then( + (c) => c.VideoPlayerComponent + ), }, { path: 'settings', diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts index c881504eb..907f9aebd 100644 --- a/apps/web/src/app/app.component.ts +++ b/apps/web/src/app/app.component.ts @@ -5,6 +5,7 @@ import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; /* import * as semver from 'semver'; */ +import { DataService, EpgService } from '@iptvnator/services'; import * as PlaylistActions from 'm3u-state'; import { ERROR, @@ -18,8 +19,6 @@ import { VIEW_ADD_PLAYLIST, VIEW_SETTINGS, } from 'shared-interfaces'; -import { DataService } from '../../../../libs/services/src/lib/data.service'; -import { EpgService } from '../../../../libs/services/src/lib/epg.service'; import { SettingsService } from './services/settings.service'; import { RecentlyViewedComponent } from './xtream-tauri/recently-viewed/recently-viewed.component'; import { SearchResultsComponent } from './xtream-tauri/search-results/search-results.component'; diff --git a/apps/web/src/app/home/home.component.ts b/apps/web/src/app/home/home.component.ts index 632f5cd73..14f3a8ae0 100644 --- a/apps/web/src/app/home/home.component.ts +++ b/apps/web/src/app/home/home.component.ts @@ -4,9 +4,9 @@ import { MatSnackBar } from '@angular/material/snack-bar'; import { DataService } from '@iptvnator/services'; import { Store } from '@ngrx/store'; import { TranslatePipe } from '@ngx-translate/core'; +import { RecentPlaylistsComponent } from 'components'; import { addPlaylist } from 'm3u-state'; import { ERROR, Playlist, PLAYLIST_PARSE_RESPONSE } from 'shared-interfaces'; -import { RecentPlaylistsComponent } from '../../../../../libs/ui/components/src/lib/recent-playlists/recent-playlists.component'; import { HeaderComponent } from '../shared/components/header/header.component'; @Component({ diff --git a/apps/web/src/app/home/stalker-portal-import/stalker-portal-import.component.ts b/apps/web/src/app/home/stalker-portal-import/stalker-portal-import.component.ts index 3174c17c4..758553156 100644 --- a/apps/web/src/app/home/stalker-portal-import/stalker-portal-import.component.ts +++ b/apps/web/src/app/home/stalker-portal-import/stalker-portal-import.component.ts @@ -9,12 +9,12 @@ import { import { MatButtonModule } from '@angular/material/button'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; +import { DataService } from '@iptvnator/services'; import { Store } from '@ngrx/store'; import { TranslatePipe } from '@ngx-translate/core'; import { addPlaylist } from 'm3u-state'; import { Playlist } from 'shared-interfaces'; import { v4 as uuid } from 'uuid'; -import { DataService } from '../../../../../../libs/services/src/lib/data.service'; @Component({ imports: [ diff --git a/libs/ui/components/src/lib/video-player/video-player.component.html b/apps/web/src/app/home/video-player/video-player.component.html similarity index 98% rename from libs/ui/components/src/lib/video-player/video-player.component.html rename to apps/web/src/app/home/video-player/video-player.component.html index b3e17407f..3b3abc88e 100644 --- a/libs/ui/components/src/lib/video-player/video-player.component.html +++ b/apps/web/src/app/home/video-player/video-player.component.html @@ -17,6 +17,7 @@ (toggleRightDrawerClicked)="drawerRight.toggle()" (multiEpgClicked)="openMultiEpgView()" [activeChannel]="activeChannel" + (settingsClicked)="openSettings()" /> @if (activeChannel.radio === 'true') { ('https://api.github.com/repos/4gray/iptvnator/releases') + .get<{ created_at: string; name: string }[]>( + 'https://api.github.com/repos/4gray/iptvnator/releases' + ) .pipe( map( (response) => diff --git a/apps/web/src/app/settings/settings.component.spec.ts b/apps/web/src/app/settings/settings.component.spec.ts index dbb5f5460..40b2c1b89 100644 --- a/apps/web/src/app/settings/settings.component.spec.ts +++ b/apps/web/src/app/settings/settings.component.spec.ts @@ -34,9 +34,9 @@ import { signal } from '@angular/core'; import { NgxIndexedDBService } from 'ngx-indexed-db'; import { of } from 'rxjs'; import { SETTINGS_UPDATE } from 'shared-interfaces'; -import { DialogService } from '../../../../../libs/services/src/lib/dialog.service'; import { EpgService } from '../../../../../libs/services/src/lib/epg.service'; import { PlaylistsService } from '../../../../../libs/services/src/lib/playlists.service'; +import { DialogService } from '../../../../../libs/ui/components/src/lib/confirm-dialog/dialog.service'; import { ElectronServiceStub } from '../services/electron.service.stub'; import { SettingsStore } from '../services/settings-store.service'; import { SettingsService } from '../services/settings.service'; diff --git a/apps/web/src/app/settings/settings.component.ts b/apps/web/src/app/settings/settings.component.ts index 9b998b442..59d2688a7 100644 --- a/apps/web/src/app/settings/settings.component.ts +++ b/apps/web/src/app/settings/settings.component.ts @@ -30,8 +30,10 @@ import { MatSelectModule } from '@angular/material/select'; import { MatSnackBar } from '@angular/material/snack-bar'; import { MatTooltipModule } from '@angular/material/tooltip'; import { Router } from '@angular/router'; +import { DataService, EpgService, PlaylistsService } from '@iptvnator/services'; import { Store } from '@ngrx/store'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { DialogService } from 'components'; import * as PlaylistActions from 'm3u-state'; import { selectIsEpgAvailable } from 'm3u-state'; import { take } from 'rxjs'; @@ -46,10 +48,6 @@ import { Theme, VideoPlayer, } from 'shared-interfaces'; -import { DataService } from '../../../../../libs/services/src/lib/data.service'; -import { DialogService } from '../../../../../libs/services/src/lib/dialog.service'; -import { EpgService } from '../../../../../libs/services/src/lib/epg.service'; -import { PlaylistsService } from '../../../../../libs/services/src/lib/playlists.service'; import { SettingsStore } from '../services/settings-store.service'; import { HeaderComponent } from '../shared/components/header/header.component'; import { SettingsService } from './../services/settings.service'; diff --git a/apps/web/src/app/shared/components/add-playlist/add-playlist-dialog.component.ts b/apps/web/src/app/shared/components/add-playlist/add-playlist-dialog.component.ts index d0619474e..485edf4bb 100644 --- a/apps/web/src/app/shared/components/add-playlist/add-playlist-dialog.component.ts +++ b/apps/web/src/app/shared/components/add-playlist/add-playlist-dialog.component.ts @@ -6,12 +6,12 @@ import { MatDialogRef, } from '@angular/material/dialog'; import { MatSnackBar } from '@angular/material/snack-bar'; +import { DataService } from '@iptvnator/services'; import { Store } from '@ngrx/store'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { parsePlaylist } from 'm3u-state'; import { getFilenameFromUrl } from 'm3u-utils'; import { PLAYLIST_PARSE_BY_URL } from 'shared-interfaces'; -import { DataService } from '../../../../../../../libs/services/src/lib/data.service'; import { FileUploadComponent } from '../../../home/file-upload/file-upload.component'; import { StalkerPortalImportComponent } from '../../../home/stalker-portal-import/stalker-portal-import.component'; import { TextImportComponent } from '../../../home/text-import/text-import.component'; diff --git a/apps/web/src/app/shared/components/grid-list/grid-list.component.ts b/apps/web/src/app/shared/components/grid-list/grid-list.component.ts index aa62a54de..8404a4b23 100644 --- a/apps/web/src/app/shared/components/grid-list/grid-list.component.ts +++ b/apps/web/src/app/shared/components/grid-list/grid-list.component.ts @@ -35,11 +35,13 @@ import { PlaylistErrorViewComponent } from '../../../xtream-tauri/playlist-error $event.target.src = './assets/images/default-poster.png' " + alt="logo" /> } @else { logo } @let rating = i.rating ?? i.rating_imdb; diff --git a/apps/web/src/app/stalker/recently-viewed/recently-viewed.component.ts b/apps/web/src/app/stalker/recently-viewed/recently-viewed.component.ts index c7065230b..2ccd9489b 100644 --- a/apps/web/src/app/stalker/recently-viewed/recently-viewed.component.ts +++ b/apps/web/src/app/stalker/recently-viewed/recently-viewed.component.ts @@ -2,8 +2,8 @@ import { Component, computed, inject, signal } from '@angular/core'; import { rxResource } from '@angular/core/rxjs-interop'; import { MatButton } from '@angular/material/button'; import { MatIcon } from '@angular/material/icon'; +import { PlaylistsService } from '@iptvnator/services'; import { TranslatePipe, TranslateService } from '@ngx-translate/core'; -import { PlaylistsService } from '../../../../../../libs/services/src/lib/playlists.service'; import { FavoritesLayoutComponent } from '../../shared/components/favorites-layout/favorites-layout.component'; import { VodDetailsComponent } from '../../xtream/vod-details/vod-details.component'; import { StalkerSeriesViewComponent } from '../stalker-series-view/stalker-series-view.component'; diff --git a/apps/web/src/app/stalker/stalker-favorites/stalker-favorites.component.ts b/apps/web/src/app/stalker/stalker-favorites/stalker-favorites.component.ts index d3620ae6a..221814b7b 100644 --- a/apps/web/src/app/stalker/stalker-favorites/stalker-favorites.component.ts +++ b/apps/web/src/app/stalker/stalker-favorites/stalker-favorites.component.ts @@ -2,8 +2,8 @@ import { Component, computed, inject, signal } from '@angular/core'; import { rxResource } from '@angular/core/rxjs-interop'; import { MatButton } from '@angular/material/button'; import { MatIcon } from '@angular/material/icon'; +import { PlaylistsService } from '@iptvnator/services'; import { TranslatePipe, TranslateService } from '@ngx-translate/core'; -import { PlaylistsService } from '../../../../../../libs/services/src/lib/playlists.service'; import { FavoritesLayoutComponent } from '../../shared/components/favorites-layout/favorites-layout.component'; import { VodDetailsComponent } from '../../xtream/vod-details/vod-details.component'; import { StalkerSeriesViewComponent } from '../stalker-series-view/stalker-series-view.component'; diff --git a/apps/web/src/app/stalker/stalker-main-container.component.ts b/apps/web/src/app/stalker/stalker-main-container.component.ts index 0ad7a461b..ffef2b59c 100644 --- a/apps/web/src/app/stalker/stalker-main-container.component.ts +++ b/apps/web/src/app/stalker/stalker-main-container.component.ts @@ -5,9 +5,9 @@ import { MatListModule } from '@angular/material/list'; import { MatPaginatorModule } from '@angular/material/paginator'; import { MatSnackBar } from '@angular/material/snack-bar'; import { ActivatedRoute, Router, RouterOutlet } from '@angular/router'; +import { PlaylistsService } from '@iptvnator/services'; import { TranslatePipe } from '@ngx-translate/core'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; -import { PlaylistsService } from '../../../../../libs/services/src/lib/playlists.service'; import { MpvPlayerBarComponent } from '../shared/components/mpv-player-bar/mpv-player-bar.component'; import { CategoryViewComponent } from '../xtream-tauri/category-view/category-view.component'; import { PlaylistErrorViewComponent } from '../xtream/playlist-error-view/playlist-error-view.component'; diff --git a/apps/web/src/app/xtream-tauri/account-info/account-info.component.ts b/apps/web/src/app/xtream-tauri/account-info/account-info.component.ts index 82ad31e81..cbaafff1b 100644 --- a/apps/web/src/app/xtream-tauri/account-info/account-info.component.ts +++ b/apps/web/src/app/xtream-tauri/account-info/account-info.component.ts @@ -2,10 +2,10 @@ import { Component, Inject, inject } from '@angular/core'; import { MatButton } from '@angular/material/button'; import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; import { MatListModule } from '@angular/material/list'; +import { DataService } from '@iptvnator/services'; import { Store } from '@ngrx/store'; import { TranslatePipe } from '@ngx-translate/core'; import { selectActivePlaylist } from 'm3u-state'; -import { DataService } from '../../../../../../libs/services/src/lib/data.service'; import { XtreamAccountInfo } from './account-info.interface'; @Component({ @@ -15,9 +15,9 @@ import { XtreamAccountInfo } from './account-info.interface';

Account Information

@if (accountInfo?.user_info?.message) { -
- {{ accountInfo?.user_info?.message }} -
+
+ {{ accountInfo?.user_info?.message }} +
}
diff --git a/apps/web/src/app/xtream-tauri/playlist-error-view/playlist-error-view.component.ts b/apps/web/src/app/xtream-tauri/playlist-error-view/playlist-error-view.component.ts index f280b5e06..d9a7c29ae 100644 --- a/apps/web/src/app/xtream-tauri/playlist-error-view/playlist-error-view.component.ts +++ b/apps/web/src/app/xtream-tauri/playlist-error-view/playlist-error-view.component.ts @@ -3,10 +3,10 @@ import { MatButtonModule } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; import { MatIconModule } from '@angular/material/icon'; import { Router, RouterLink } from '@angular/router'; -import { DatabaseService, DialogService } from '@iptvnator/services'; +import { DatabaseService } from '@iptvnator/services'; import { Store } from '@ngrx/store'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { PlaylistInfoComponent } from 'components'; +import { DialogService, PlaylistInfoComponent } from 'components'; import * as PlaylistActions from 'm3u-state'; import { selectCurrentPlaylist } from 'm3u-state'; import { Playlist } from 'shared-interfaces'; diff --git a/apps/web/src/app/xtream-tauri/search-results/search-results.component.ts b/apps/web/src/app/xtream-tauri/search-results/search-results.component.ts index 9f0af0851..53564774a 100644 --- a/apps/web/src/app/xtream-tauri/search-results/search-results.component.ts +++ b/apps/web/src/app/xtream-tauri/search-results/search-results.component.ts @@ -23,10 +23,10 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIcon } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { ActivatedRoute, Router } from '@angular/router'; +import { DatabaseService } from '@iptvnator/services'; import { TranslatePipe } from '@ngx-translate/core'; import groupBy from 'lodash/groupBy'; -import { DatabaseService } from '../../../../../../libs/services/src/lib/database.service'; -import { XtreamItem } from '../../../../../../libs/shared/interfaces/src/lib/xtream-item.interface'; +import { XtreamItem } from 'shared-interfaces'; import { SearchFormComponent } from '../../shared/components/search-form/search-form.component'; import { SearchResultItemComponent } from '../../shared/components/search-result-item/search-result-item.component'; import { XtreamStore } from '../xtream.store'; diff --git a/apps/web/src/app/xtream-tauri/services/favorites.service.ts b/apps/web/src/app/xtream-tauri/services/favorites.service.ts index 65532c7f1..2850e5c60 100644 --- a/apps/web/src/app/xtream-tauri/services/favorites.service.ts +++ b/apps/web/src/app/xtream-tauri/services/favorites.service.ts @@ -1,6 +1,6 @@ import { inject, Injectable } from '@angular/core'; +import { DatabaseService } from '@iptvnator/services'; import { from, map, mergeMap, Observable } from 'rxjs'; -import { DatabaseService } from '../../../../../../libs/services/src/lib/database.service'; import { FavoriteItem } from './favorite-item.interface'; @Injectable({ diff --git a/apps/web/src/app/xtream-tauri/with-favorites.feature.ts b/apps/web/src/app/xtream-tauri/with-favorites.feature.ts index 7420a9b9d..3c9addc49 100644 --- a/apps/web/src/app/xtream-tauri/with-favorites.feature.ts +++ b/apps/web/src/app/xtream-tauri/with-favorites.feature.ts @@ -1,11 +1,11 @@ import { inject } from '@angular/core'; +import { DatabaseService } from '@iptvnator/services'; import { patchState, signalStoreFeature, withMethods, withState, } from '@ngrx/signals'; -import { DatabaseService } from '../../../../../libs/services/src/lib/database.service'; import { FavoritesService } from './services/favorites.service'; export const withFavorites = function () { diff --git a/apps/web/src/app/xtream-tauri/with-recent-items.ts b/apps/web/src/app/xtream-tauri/with-recent-items.ts index ed32b7afc..d1d9044f3 100644 --- a/apps/web/src/app/xtream-tauri/with-recent-items.ts +++ b/apps/web/src/app/xtream-tauri/with-recent-items.ts @@ -1,4 +1,5 @@ import { inject, Signal } from '@angular/core'; +import { DatabaseService } from '@iptvnator/services'; import { patchState, signalStoreFeature, @@ -7,7 +8,6 @@ import { } from '@ngrx/signals'; import { rxMethod } from '@ngrx/signals/rxjs-interop'; import { pipe, switchMap, tap } from 'rxjs'; -import { DatabaseService } from '../../../../../libs/services/src/lib/database.service'; export interface RecentlyViewedItem { id: number; diff --git a/apps/web/src/app/xtream/category-content-view/category-content-view.component.ts b/apps/web/src/app/xtream/category-content-view/category-content-view.component.ts index 975997bf8..5cd19c87a 100644 --- a/apps/web/src/app/xtream/category-content-view/category-content-view.component.ts +++ b/apps/web/src/app/xtream/category-content-view/category-content-view.component.ts @@ -5,7 +5,7 @@ import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { FilterPipe, SortPipe } from '@iptvnator/pipes'; import { TranslateModule } from '@ngx-translate/core'; -import { XtreamItem } from '../../../../../../libs/shared/interfaces/src/lib/xtream-item.interface'; +import { XtreamItem } from 'shared-interfaces'; import { PlaylistErrorViewComponent } from '../playlist-error-view/playlist-error-view.component'; import { PortalStore } from '../portal.store'; diff --git a/apps/web/src/app/xtream/playlist-error-view/playlist-error-view.component.ts b/apps/web/src/app/xtream/playlist-error-view/playlist-error-view.component.ts index ab98f5e0c..e3b1dba13 100644 --- a/apps/web/src/app/xtream/playlist-error-view/playlist-error-view.component.ts +++ b/apps/web/src/app/xtream/playlist-error-view/playlist-error-view.component.ts @@ -3,10 +3,9 @@ import { MatButtonModule } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; import { MatIconModule } from '@angular/material/icon'; import { Router, RouterLink } from '@angular/router'; -import { DialogService } from '@iptvnator/services'; import { Store } from '@ngrx/store'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { PlaylistInfoComponent } from 'components'; +import { DialogService, PlaylistInfoComponent } from 'components'; import * as PlaylistActions from 'm3u-state'; import { selectCurrentPlaylist } from 'm3u-state'; import { Playlist } from 'shared-interfaces'; @@ -18,13 +17,13 @@ import { Playlist } from 'shared-interfaces'; imports: [MatButtonModule, MatIconModule, RouterLink, TranslateModule], }) export class PlaylistErrorViewComponent { - dialog = inject(MatDialog); - dialogService = inject(DialogService); - router = inject(Router); - store = inject(Store); - translate = inject(TranslateService); + readonly dialog = inject(MatDialog); + readonly dialogService = inject(DialogService); + readonly router = inject(Router); + readonly store = inject(Store); + readonly translate = inject(TranslateService); - currentPlaylist = this.store.selectSignal(selectCurrentPlaylist); + readonly currentPlaylist = this.store.selectSignal(selectCurrentPlaylist); @Input() description: string; @Input() showActionButtons = true; diff --git a/apps/web/tsconfig.spec.json b/apps/web/tsconfig.spec.json index 7ec461422..a16a365c0 100644 --- a/apps/web/tsconfig.spec.json +++ b/apps/web/tsconfig.spec.json @@ -14,7 +14,7 @@ "src/**/*.spec.ts", "src/**/*.d.ts", "../../libs/services/src/lib/epg.service.spec.ts", - "../../libs/services/src/lib/dialog.service.spec.ts", + "../../libs/ui/components/src/lib/confirm-dialog/dialog.service.spec.ts", "../../libs/ui/pipes/src/lib/moment-date.pipe.spec.ts" ] } diff --git a/libs/services/src/index.ts b/libs/services/src/index.ts index 3869181e9..e61e92cfb 100644 --- a/libs/services/src/index.ts +++ b/libs/services/src/index.ts @@ -1,6 +1,5 @@ export * from './lib/data.service'; export * from './lib/database.service'; -export * from './lib/dialog.service'; export * from './lib/epg.service'; export * from './lib/playlists.service'; export * from './lib/portal-status.service'; diff --git a/libs/shared/interfaces/src/index.ts b/libs/shared/interfaces/src/index.ts index 95fb850dd..99f676d0c 100644 --- a/libs/shared/interfaces/src/index.ts +++ b/libs/shared/interfaces/src/index.ts @@ -16,6 +16,7 @@ export * from './lib/stalker-portal-actions.enum'; export * from './lib/store-keys.enum'; export * from './lib/stream-format.enum'; export * from './lib/theme.enum'; +export * from './lib/tokens'; export * from './lib/xtream-category.interface'; export * from './lib/xtream-code-actions'; export * from './lib/xtream-item.interface'; @@ -25,3 +26,5 @@ export * from './lib/xtream-serie-details.interface'; export * from './lib/xtream-serie-item.interface'; export * from './lib/xtream-vod-details.interface'; export * from './lib/xtream-vod-stream.interface'; + +import './lib/global.d'; diff --git a/apps/web/src/global.d.ts b/libs/shared/interfaces/src/lib/global.d.ts similarity index 66% rename from apps/web/src/global.d.ts rename to libs/shared/interfaces/src/lib/global.d.ts index bd78dad19..830ad4eb9 100644 --- a/apps/web/src/global.d.ts +++ b/libs/shared/interfaces/src/lib/global.d.ts @@ -1,9 +1,9 @@ import 'jest-extended'; -import { Playlist } from 'shared-interfaces'; +import { Playlist } from './playlist.interface'; declare module 'video.js' { export interface VideoJsPlayer { - hlsQualitySelector(options?: any): void; + hlsQualitySelector(options?: Record): void; } } @@ -22,5 +22,13 @@ declare global { ) => Promise; openPlaylistFromFile: () => Promise; }; + process: NodeJS.Process; + require: NodeRequire; } } + +// SystemJS module definition +declare const nodeModule: NodeModule; +interface NodeModule { + id: string; +} diff --git a/libs/shared/interfaces/src/lib/tokens.ts b/libs/shared/interfaces/src/lib/tokens.ts new file mode 100644 index 000000000..2e78f6988 --- /dev/null +++ b/libs/shared/interfaces/src/lib/tokens.ts @@ -0,0 +1,5 @@ +import { InjectionToken } from '@angular/core'; + +export const COMPONENT_OVERLAY_REF = new InjectionToken( + 'COMPONENT_OVERLAY_REF' +); diff --git a/libs/shared/interfaces/src/lib/xtream-live-stream.interface.ts b/libs/shared/interfaces/src/lib/xtream-live-stream.interface.ts index 1fa44ab69..eafbc345a 100644 --- a/libs/shared/interfaces/src/lib/xtream-live-stream.interface.ts +++ b/libs/shared/interfaces/src/lib/xtream-live-stream.interface.ts @@ -1,4 +1,4 @@ -import { XtreamItem } from 'shared-interfaces'; +import { XtreamItem } from './xtream-item.interface'; export interface XtreamLiveStream extends XtreamItem { stream_type: 'live'; diff --git a/libs/shared/interfaces/src/lib/xtream-vod-stream.interface.ts b/libs/shared/interfaces/src/lib/xtream-vod-stream.interface.ts index ecf3c95d6..4df9d9449 100644 --- a/libs/shared/interfaces/src/lib/xtream-vod-stream.interface.ts +++ b/libs/shared/interfaces/src/lib/xtream-vod-stream.interface.ts @@ -1,4 +1,4 @@ -import { XtreamItem } from 'shared-interfaces'; +import { XtreamItem } from './xtream-item.interface'; export interface XtreamVodStream extends XtreamItem { stream_type: 'movie'; diff --git a/libs/ui/components/src/index.ts b/libs/ui/components/src/index.ts index f80362922..d5c46c97a 100644 --- a/libs/ui/components/src/index.ts +++ b/libs/ui/components/src/index.ts @@ -2,6 +2,7 @@ export * from './lib/art-player/art-player.component'; export * from './lib/audio-player/audio-player.component'; export * from './lib/channel-list-container/channel-list-container.component'; export * from './lib/confirm-dialog/confirm-dialog.component'; +export * from './lib/confirm-dialog/dialog.service'; export * from './lib/epg-list/epg-item-description/epg-item-description.component'; export * from './lib/epg-list/epg-list-item/epg-list-item.component'; export * from './lib/epg-list/epg-list.component'; @@ -13,5 +14,4 @@ export * from './lib/recent-playlists/playlist-item/playlist-item.component'; export * from './lib/recent-playlists/recent-playlists.component'; export * from './lib/video-player/sidebar/sidebar.component'; export * from './lib/video-player/toolbar/toolbar.component'; -export * from './lib/video-player/video-player.component'; export * from './lib/vjs-player/vjs-player.component'; diff --git a/libs/services/src/lib/dialog.service.spec.ts b/libs/ui/components/src/lib/confirm-dialog/dialog.service.spec.ts similarity index 91% rename from libs/services/src/lib/dialog.service.spec.ts rename to libs/ui/components/src/lib/confirm-dialog/dialog.service.spec.ts index 74cf2b96e..9c54c1818 100644 --- a/libs/services/src/lib/dialog.service.spec.ts +++ b/libs/ui/components/src/lib/confirm-dialog/dialog.service.spec.ts @@ -3,7 +3,7 @@ import { MatDialog, MatDialogModule } from '@angular/material/dialog'; import { TranslateModule } from '@ngx-translate/core'; import { MockComponent, MockModule } from 'ng-mocks'; import { EMPTY } from 'rxjs'; -import { ConfirmDialogData } from '../../../../apps/web/src/app/shared/components/confirm-dialog/confirm-dialog-data.interface'; +import { ConfirmDialogData } from '../<../../../apps/web/src/app/shared/components/confirm-dialog/confirm-dialog-data.interface'; import { ConfirmDialogComponent } from '../../../../apps/web/src/app/shared/components/confirm-dialog/confirm-dialog.component'; import { DialogService } from './dialog.service'; diff --git a/libs/services/src/lib/dialog.service.ts b/libs/ui/components/src/lib/confirm-dialog/dialog.service.ts similarity index 87% rename from libs/services/src/lib/dialog.service.ts rename to libs/ui/components/src/lib/confirm-dialog/dialog.service.ts index 0bef6399e..382a852e6 100644 --- a/libs/services/src/lib/dialog.service.ts +++ b/libs/ui/components/src/lib/confirm-dialog/dialog.service.ts @@ -1,6 +1,9 @@ import { inject, Injectable } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; -import { ConfirmDialogComponent, ConfirmDialogData } from 'components'; +import { + ConfirmDialogComponent, + ConfirmDialogData, +} from './confirm-dialog.component'; @Injectable({ providedIn: 'root', diff --git a/libs/ui/components/src/lib/epg-list/epg-item-description/epg-item-description.component.ts b/libs/ui/components/src/lib/epg-list/epg-item-description/epg-item-description.component.ts index 048cd98c8..3d3369bd8 100644 --- a/libs/ui/components/src/lib/epg-list/epg-item-description/epg-item-description.component.ts +++ b/libs/ui/components/src/lib/epg-list/epg-item-description/epg-item-description.component.ts @@ -1,8 +1,8 @@ -import { Component, Inject } from '@angular/core'; +import { Component, inject } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; import { TranslatePipe } from '@ngx-translate/core'; -import { EpgProgram } from '../../../../../../shared/interfaces/src/lib/epg-program.model'; +import { EpgProgram } from 'shared-interfaces'; @Component({ selector: 'app-epg-item-description', @@ -11,6 +11,8 @@ import { EpgProgram } from '../../../../../../shared/interfaces/src/lib/epg-prog imports: [MatButtonModule, MatDialogModule, TranslatePipe], }) export class EpgItemDescriptionComponent { + dialogData = inject(MAT_DIALOG_DATA); + /** EPG program object */ epgProgram: EpgProgram; @@ -18,7 +20,7 @@ export class EpgItemDescriptionComponent { * Creates an instance of the component and injects the program of the clicked epg program * @param epgProgram epg program */ - constructor(@Inject(MAT_DIALOG_DATA) epgProgram: EpgProgram) { - this.epgProgram = epgProgram; + constructor() { + this.epgProgram = this.dialogData; } } diff --git a/libs/ui/components/src/lib/epg-list/epg-list-item/epg-list-item.component.ts b/libs/ui/components/src/lib/epg-list/epg-list-item/epg-list-item.component.ts index aede220bf..2e53fa099 100644 --- a/libs/ui/components/src/lib/epg-list/epg-list-item/epg-list-item.component.ts +++ b/libs/ui/components/src/lib/epg-list/epg-list-item/epg-list-item.component.ts @@ -1,10 +1,10 @@ -import { Component, Input } from '@angular/core'; +import { Component, inject, Input } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { MatIcon } from '@angular/material/icon'; import { MatTooltip } from '@angular/material/tooltip'; +import { MomentDatePipe } from '@iptvnator/pipes'; import { TranslatePipe } from '@ngx-translate/core'; -import { EpgProgram } from '../../../../../../shared/interfaces/src/lib/epg-program.model'; -import { MomentDatePipe } from '../../../../../pipes/src/lib/moment-date.pipe'; +import { EpgProgram } from 'shared-interfaces'; import { EpgItemDescriptionComponent } from '../epg-item-description/epg-item-description.component'; @Component({ @@ -14,20 +14,16 @@ import { EpgItemDescriptionComponent } from '../epg-item-description/epg-item-de styleUrls: ['./epg-list-item.component.scss'], }) export class EpgListItemComponent { + private dialog = inject(MatDialog); + /** EPG Program to render */ - @Input() item: EpgProgram; + @Input() item!: EpgProgram; /** Actual time */ - @Input() timeNow: string; + @Input() timeNow!: string; /** Aviability of the timeshift function until date */ - @Input() timeshiftUntil: string; - - /** - * Creates an instance of EpgListItemComponent - * @param dialog angular material dialog - */ - constructor(private dialog: MatDialog) {} + @Input() timeshiftUntil!: string; /** * Opens the dialog with details about the selected program diff --git a/libs/ui/components/src/lib/epg-list/epg-list.component.ts b/libs/ui/components/src/lib/epg-list/epg-list.component.ts index 820e984a1..83b0c4dfd 100644 --- a/libs/ui/components/src/lib/epg-list/epg-list.component.ts +++ b/libs/ui/components/src/lib/epg-list/epg-list.component.ts @@ -6,7 +6,8 @@ import { MatDividerModule } from '@angular/material/divider'; import { MatIconModule } from '@angular/material/icon'; import { MatListModule } from '@angular/material/list'; import { MatTooltipModule } from '@angular/material/tooltip'; -import { DataService } from '@iptvnator/services'; +import { MomentDatePipe } from '@iptvnator/pipes'; +import { DataService, EpgService } from '@iptvnator/services'; import { Store } from '@ngrx/store'; import { TranslatePipe } from '@ngx-translate/core'; import { @@ -23,8 +24,6 @@ import { EpgChannel, EpgProgram, } from 'shared-interfaces'; -import { EpgService } from '../../../../../services/src/lib/epg.service'; -import { MomentDatePipe } from '../../../../pipes/src/lib/moment-date.pipe'; import { EpgListItemComponent } from './epg-list-item/epg-list-item.component'; export interface EpgData { diff --git a/libs/ui/components/src/lib/info-overlay/info-overlay.component.ts b/libs/ui/components/src/lib/info-overlay/info-overlay.component.ts index 942c19632..80e012cdb 100644 --- a/libs/ui/components/src/lib/info-overlay/info-overlay.component.ts +++ b/libs/ui/components/src/lib/info-overlay/info-overlay.component.ts @@ -1,8 +1,8 @@ import { NgStyle } from '@angular/common'; import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'; +import { MomentDatePipe } from '@iptvnator/pipes'; import moment from 'moment'; import { Channel, EpgProgram } from 'shared-interfaces'; -import { MomentDatePipe } from '../../../../pipes/src/lib/moment-date.pipe'; @Component({ imports: [MomentDatePipe, NgStyle], @@ -27,28 +27,28 @@ export class InfoOverlayComponent implements OnChanges { finishedDuration!: number; /** Program start time */ - start; + start: any | undefined; /** Program end time */ - stop; + stop: any | undefined; /** Timeout for the overlay visibility */ - currentTimeout; + currentTimeout: number | undefined; /** * Calculates the necessary information for the visualization in the overview popup * @param changes component input changes */ ngOnChanges(changes: SimpleChanges): void { - if (changes.channel) { + if (changes['channel'] && changes['channel'].currentValue) { clearTimeout(this.currentTimeout); this.isVisible = true; this.currentTimeout = setTimeout(() => { this.isVisible = false; }, 4000); } - if (changes.epgProgram && changes.epgProgram.currentValue) { - const { stop, start } = changes.epgProgram.currentValue; + if (changes['epgProgram'] && changes['epgProgram'].currentValue) { + const { stop, start } = changes['epgProgram'].currentValue; this.setProgramDuration(start, stop); } } diff --git a/libs/ui/components/src/lib/multi-epg/multi-epg-container.component.ts b/libs/ui/components/src/lib/multi-epg/multi-epg-container.component.ts index 4e1499a95..8ef8e402e 100644 --- a/libs/ui/components/src/lib/multi-epg/multi-epg-container.component.ts +++ b/libs/ui/components/src/lib/multi-epg/multi-epg-container.component.ts @@ -16,16 +16,18 @@ import { MatButtonModule } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; import { MatIcon } from '@angular/material/icon'; import { MatTooltip } from '@angular/material/tooltip'; +import { MomentDatePipe } from '@iptvnator/pipes'; import { TranslatePipe } from '@ngx-translate/core'; import { invoke } from '@tauri-apps/api/core'; import { addDays, differenceInMinutes, format, parse, subDays } from 'date-fns'; import { BehaviorSubject, Observable } from 'rxjs'; -import { Channel } from 'shared-interfaces'; -import { EpgChannel } from '../../../../../shared/interfaces/src/lib/epg-channel.model'; -import { EpgProgram } from '../../../../../shared/interfaces/src/lib/epg-program.model'; -import { MomentDatePipe } from '../../../../pipes/src/lib/moment-date.pipe'; +import { + Channel, + COMPONENT_OVERLAY_REF, + EpgChannel, + EpgProgram, +} from 'shared-interfaces'; import { EpgItemDescriptionComponent } from '../epg-list/epg-item-description/epg-item-description.component'; -import { COMPONENT_OVERLAY_REF } from '../video-player/video-player.component'; interface EnrichedProgram extends EpgProgram { startDate: Date; @@ -55,7 +57,7 @@ interface EnrichedChannel extends EpgChannel { export class MultiEpgContainerComponent implements OnInit, AfterViewInit, OnDestroy { - @ViewChild('epgContainer') epgContainer: ElementRef; + @ViewChild('epgContainer') epgContainer!: ElementRef; @Input() set playlistChannels(value: Observable) { if (value) { diff --git a/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.spec.ts b/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.spec.ts index 92b1e3fcd..f24b6ca87 100644 --- a/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.spec.ts +++ b/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.spec.ts @@ -17,7 +17,7 @@ import { NgxSkeletonLoaderComponent } from 'ngx-skeleton-loader'; import { Observable } from 'rxjs'; import { PLAYLIST_UPDATE, PlaylistMeta } from 'shared-interfaces'; import { ElectronServiceStub } from '../../../../../../apps/web/src/app/services/electron.service.stub'; -import { DialogService } from '../../../../../services/src/lib/dialog.service'; +import { DialogService } from '../confirm-dialog/dialog.service'; import { PlaylistItemComponent } from './playlist-item/playlist-item.component'; import { RecentPlaylistsComponent } from './recent-playlists.component'; diff --git a/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.ts b/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.ts index 06d2546df..1b6748e78 100644 --- a/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.ts +++ b/libs/ui/components/src/lib/recent-playlists/recent-playlists.component.ts @@ -18,12 +18,7 @@ import { MatInputModule } from '@angular/material/input'; import { MatListModule } from '@angular/material/list'; import { MatSnackBar } from '@angular/material/snack-bar'; import { Router } from '@angular/router'; -import { - DatabaseService, - DataService, - DialogService, - SortService, -} from '@iptvnator/services'; +import { DatabaseService, DataService, SortService } from '@iptvnator/services'; import { Store } from '@ngrx/store'; import { TranslatePipe, TranslateService } from '@ngx-translate/core'; import * as PlaylistActions from 'm3u-state'; @@ -42,6 +37,7 @@ import { PLAYLIST_UPDATE_RESPONSE, PlaylistMeta, } from 'shared-interfaces'; +import { DialogService } from '../confirm-dialog/dialog.service'; import { PlaylistInfoComponent } from './playlist-info/playlist-info.component'; import { PlaylistItemComponent } from './playlist-item/playlist-item.component'; diff --git a/libs/ui/components/src/lib/video-player/sidebar/sidebar.component.ts b/libs/ui/components/src/lib/video-player/sidebar/sidebar.component.ts index 33efe3f57..1d00e82c7 100644 --- a/libs/ui/components/src/lib/video-player/sidebar/sidebar.component.ts +++ b/libs/ui/components/src/lib/video-player/sidebar/sidebar.component.ts @@ -9,8 +9,8 @@ import { TranslatePipe } from '@ngx-translate/core'; import * as PlaylistActions from 'm3u-state'; import { selectPlaylistTitle } from 'm3u-state'; import { Channel } from 'shared-interfaces'; +import { SidebarView } from '../../../../../../../apps/web/src/app/home/video-player/video-player.component'; import { RecentPlaylistsComponent } from '../../recent-playlists/recent-playlists.component'; -import { SidebarView } from '../video-player.component'; import { ChannelListContainerComponent } from './../../channel-list-container/channel-list-container.component'; @Component({ diff --git a/libs/ui/components/src/lib/video-player/toolbar/toolbar.component.html b/libs/ui/components/src/lib/video-player/toolbar/toolbar.component.html index 8fd47f7bf..98fd2f5ba 100644 --- a/libs/ui/components/src/lib/video-player/toolbar/toolbar.component.html +++ b/libs/ui/components/src/lib/video-player/toolbar/toolbar.component.html @@ -26,7 +26,7 @@