diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts index a42953de3..e48bb3113 100644 --- a/apps/web/src/app/app.component.ts +++ b/apps/web/src/app/app.component.ts @@ -4,10 +4,8 @@ import { Router, RouterOutlet } from '@angular/router'; import { Actions, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; +import { PlaylistActions, selectAllPlaylistsMeta } from 'm3u-state'; import { filter, take } from 'rxjs'; -/* import * as semver from 'semver'; */ -import * as PlaylistActions from 'm3u-state'; -import { selectAllPlaylistsMeta } from 'm3u-state'; import { DataService, EpgService } from 'services'; import { AUTO_UPDATE_PLAYLISTS, @@ -28,7 +26,9 @@ import { SearchResultsComponent } from './xtream-tauri/search-results/search-res }) export class AppComponent implements OnInit { @HostBinding('class.macos-platform') get isMacOS() { - return window.electron && navigator.platform.toLowerCase().includes('mac'); + return ( + window.electron && navigator.platform.toLowerCase().includes('mac') + ); } private actions$ = inject(Actions); private dataService = inject(DataService); diff --git a/apps/web/src/app/home/file-upload/file-upload.component.ts b/apps/web/src/app/home/file-upload/file-upload.component.ts index b4de5ff75..6fea546d4 100644 --- a/apps/web/src/app/home/file-upload/file-upload.component.ts +++ b/apps/web/src/app/home/file-upload/file-upload.component.ts @@ -2,7 +2,7 @@ import { Component, EventEmitter, inject, Output } from '@angular/core'; import { MatIconModule } from '@angular/material/icon'; import { Store } from '@ngrx/store'; import { TranslatePipe } from '@ngx-translate/core'; -import { addPlaylist } from 'm3u-state'; +import { PlaylistActions } from 'm3u-state'; import { DragDropFileUploadDirective } from './drag-drop-file-upload.directive'; @Component({ @@ -45,7 +45,7 @@ export class FileUploadComponent { playlistObject ); this.store.dispatch( - addPlaylist({ playlist: playlistObject }) + PlaylistActions.addPlaylist({ playlist: playlistObject }) ); } else { // User canceled the dialog 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 7312e6997..f0c4d1a90 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 @@ -11,7 +11,7 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { Store } from '@ngrx/store'; import { TranslatePipe } from '@ngx-translate/core'; -import { addPlaylist } from 'm3u-state'; +import { PlaylistActions } from 'm3u-state'; import { DataService } from 'services'; import { Playlist } from 'shared-interfaces'; import { v4 as uuid } from 'uuid'; @@ -67,7 +67,7 @@ export class StalkerPortalImportComponent { this.form.value.portalUrl ); this.store.dispatch( - addPlaylist({ playlist: this.form.value as Playlist }) + PlaylistActions.addPlaylist({ playlist: this.form.value as Playlist }) ); this.addClicked.emit(); } diff --git a/apps/web/src/app/home/video-player/video-player.component.ts b/apps/web/src/app/home/video-player/video-player.component.ts index a7327012f..da9cc285e 100644 --- a/apps/web/src/app/home/video-player/video-player.component.ts +++ b/apps/web/src/app/home/video-player/video-player.component.ts @@ -27,7 +27,7 @@ import { ToolbarComponent, VjsPlayerComponent, } from 'components'; -import * as PlaylistActions from 'm3u-state'; +import { PlaylistActions, ChannelActions, FavoritesActions } from 'm3u-state'; import { selectActive, selectChannels, @@ -169,7 +169,7 @@ export class VideoPlayerComponent implements OnInit { } this.store.dispatch( - PlaylistActions.setChannels({ + ChannelActions.setChannels({ channels: playlist.playlist.items, }) ); @@ -180,14 +180,14 @@ export class VideoPlayerComponent implements OnInit { playlist.favorites.length > 0 ) { this.store.dispatch( - PlaylistActions.setFavorites({ + FavoritesActions.setFavorites({ channelIds: playlist.favorites, }) ); } else { // Clear favorites if playlist has none this.store.dispatch( - PlaylistActions.setFavorites({ + FavoritesActions.setFavorites({ channelIds: [], }) ); @@ -255,7 +255,7 @@ export class VideoPlayerComponent implements OnInit { // Dispatch action to change channel const nextChannel = channels[nextIndex]; this.store.dispatch( - PlaylistActions.setActiveChannel({ + ChannelActions.setActiveChannel({ channel: nextChannel, }) ); @@ -444,7 +444,7 @@ export class VideoPlayerComponent implements OnInit { .subscribe((channel) => { if (channel) { this.store.dispatch( - PlaylistActions.setActiveChannel({ channel }) + ChannelActions.setActiveChannel({ channel }) ); } }); diff --git a/apps/web/src/app/home/xtream-code-import/xtream-code-import.component.ts b/apps/web/src/app/home/xtream-code-import/xtream-code-import.component.ts index f4f3e20c3..dbdb9e759 100644 --- a/apps/web/src/app/home/xtream-code-import/xtream-code-import.component.ts +++ b/apps/web/src/app/home/xtream-code-import/xtream-code-import.component.ts @@ -12,7 +12,7 @@ import { MatIcon } from '@angular/material/icon'; import { MatInputModule } from '@angular/material/input'; import { Store } from '@ngrx/store'; import { TranslatePipe } from '@ngx-translate/core'; -import { addPlaylist } from 'm3u-state'; +import { PlaylistActions } from 'm3u-state'; import { PortalStatus, PortalStatusService } from 'services'; import { Playlist } from 'shared-interfaces'; import { v4 as uuid } from 'uuid'; @@ -137,7 +137,7 @@ export class XtreamCodeImportComponent { url.port ? ':' + url.port : '' }`; this.store.dispatch( - addPlaylist({ + PlaylistActions.addPlaylist({ playlist: { ...this.form.value, serverUrl, diff --git a/apps/web/src/app/services/electron.service.ts b/apps/web/src/app/services/electron.service.ts index cee7b310f..3bee601e9 100644 --- a/apps/web/src/app/services/electron.service.ts +++ b/apps/web/src/app/services/electron.service.ts @@ -3,7 +3,7 @@ import { MatSnackBar } from '@angular/material/snack-bar'; import { Params } from '@angular/router'; import { Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; -import * as PlaylistActions from 'm3u-state'; +import { PlaylistActions } from 'm3u-state'; import { DataService } from 'services'; import { AUTO_UPDATE_PLAYLISTS, diff --git a/apps/web/src/app/services/pwa.service.ts b/apps/web/src/app/services/pwa.service.ts index e4535f2e0..643246807 100644 --- a/apps/web/src/app/services/pwa.service.ts +++ b/apps/web/src/app/services/pwa.service.ts @@ -5,7 +5,7 @@ import { Params } from '@angular/router'; import { SwUpdate } from '@angular/service-worker'; import { Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; -import * as PlaylistActions from 'm3u-state'; +import { PlaylistActions } from 'm3u-state'; import { catchError, firstValueFrom, throwError } from 'rxjs'; import { DataService } from 'services'; import { diff --git a/apps/web/src/app/settings/settings.component.ts b/apps/web/src/app/settings/settings.component.ts index 21d578c35..f12c0062e 100644 --- a/apps/web/src/app/settings/settings.component.ts +++ b/apps/web/src/app/settings/settings.component.ts @@ -35,8 +35,7 @@ import { Store } from '@ngrx/store'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { QRCodeComponent } from 'angularx-qrcode'; import { DialogService } from 'components'; -import * as PlaylistActions from 'm3u-state'; -import { selectIsEpgAvailable } from 'm3u-state'; +import { PlaylistActions, selectIsEpgAvailable } from 'm3u-state'; import { take } from 'rxjs'; import { DataService, EpgService, PlaylistsService } from 'services'; import { 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 69ce685be..8dc1f54b8 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 @@ -8,7 +8,7 @@ import { import { MatSnackBar } from '@angular/material/snack-bar'; import { Store } from '@ngrx/store'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { parsePlaylist } from 'm3u-state'; +import { PlaylistActions } from 'm3u-state'; import { getFilenameFromUrl } from 'm3u-utils'; import { DataService } from 'services'; import { PLAYLIST_PARSE_BY_URL } from 'shared-interfaces'; @@ -57,11 +57,11 @@ export class AddPlaylistDialogComponent { .result as string; this.store.dispatch( - parsePlaylist({ + PlaylistActions.parsePlaylist({ uploadType: 'FILE', playlist, title: payload.file.name, - path: (payload.file as any).path, + path: (payload.file as File & { path?: string }).path, }) ); this.closeDialog(); @@ -93,7 +93,7 @@ export class AddPlaylistDialogComponent { */ uploadAsText(playlist: string): void { this.store.dispatch( - parsePlaylist({ + PlaylistActions.parsePlaylist({ uploadType: 'TEXT', playlist, title: this.translateService.instant('HOME.IMPORTED_AS_TEXT'), diff --git a/apps/web/src/app/stalker/stalker-shell/stalker-shell.component.ts b/apps/web/src/app/stalker/stalker-shell/stalker-shell.component.ts index 497d3b38a..caee8a551 100644 --- a/apps/web/src/app/stalker/stalker-shell/stalker-shell.component.ts +++ b/apps/web/src/app/stalker/stalker-shell/stalker-shell.component.ts @@ -1,7 +1,7 @@ import { Component, effect, inject, OnDestroy } from '@angular/core'; import { ActivatedRoute, Router, RouterOutlet } from '@angular/router'; import { Store } from '@ngrx/store'; -import * as PlaylistActions from 'm3u-state'; +import { PlaylistActions } from 'm3u-state'; import { selectPlaylistById } from 'm3u-state'; import { NavigationComponent } from '../../xtream-tauri/navigation/navigation.component'; import { NavigationItem } from '../../xtream-tauri/navigation/navigation.interface'; 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 6b227adb1..a1c6f1ea8 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 @@ -6,7 +6,7 @@ import { Router, RouterLink } from '@angular/router'; import { Store } from '@ngrx/store'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { DialogService, PlaylistInfoComponent } from 'components'; -import * as PlaylistActions from 'm3u-state'; +import { PlaylistActions } from 'm3u-state'; import { selectCurrentPlaylist } from 'm3u-state'; import { DatabaseService } from 'services'; import { Playlist } from 'shared-interfaces'; diff --git a/apps/web/src/app/xtream-tauri/xtream-shell/xtream-shell.component.ts b/apps/web/src/app/xtream-tauri/xtream-shell/xtream-shell.component.ts index 18f038dd3..dd0448586 100644 --- a/apps/web/src/app/xtream-tauri/xtream-shell/xtream-shell.component.ts +++ b/apps/web/src/app/xtream-tauri/xtream-shell/xtream-shell.component.ts @@ -2,7 +2,7 @@ import { Component, effect, inject } from '@angular/core'; import { ActivatedRoute, Router, RouterOutlet } from '@angular/router'; import { Store } from '@ngrx/store'; import { TranslateModule } from '@ngx-translate/core'; -import * as PlaylistActions from 'm3u-state'; +import { PlaylistActions } from 'm3u-state'; import { LoadingOverlayComponent } from '../loading-overlay/loading-overlay.component'; import { NavigationComponent } from '../navigation/navigation.component'; import { NavigationItem } from '../navigation/navigation.interface'; 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 9fcb6b741..a66b1acd4 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 @@ -6,7 +6,7 @@ import { Router, RouterLink } from '@angular/router'; import { Store } from '@ngrx/store'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { DialogService, PlaylistInfoComponent } from 'components'; -import * as PlaylistActions from 'm3u-state'; +import { PlaylistActions } from 'm3u-state'; import { selectCurrentPlaylist } from 'm3u-state'; import { Playlist } from 'shared-interfaces'; diff --git a/libs/ui/components/src/lib/audio-player/audio-player.component.ts b/libs/ui/components/src/lib/audio-player/audio-player.component.ts index 73b099235..77a278219 100644 --- a/libs/ui/components/src/lib/audio-player/audio-player.component.ts +++ b/libs/ui/components/src/lib/audio-player/audio-player.component.ts @@ -12,7 +12,7 @@ import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatSliderModule } from '@angular/material/slider'; import { Store } from '@ngrx/store'; -import { setAdjacentChannelAsActive } from 'm3u-state'; +import { ChannelActions } from 'm3u-state'; @Component({ selector: 'app-audio-player', @@ -125,6 +125,6 @@ export class AudioPlayerComponent implements OnChanges { } switchChannel(direction: 'next' | 'previous') { - this.store.dispatch(setAdjacentChannelAsActive({ direction })); + this.store.dispatch(ChannelActions.setAdjacentChannelAsActive({ direction })); } } diff --git a/libs/ui/components/src/lib/channel-list-container/channel-list-container.component.ts b/libs/ui/components/src/lib/channel-list-container/channel-list-container.component.ts index b5ed9594f..1003de803 100644 --- a/libs/ui/components/src/lib/channel-list-container/channel-list-container.component.ts +++ b/libs/ui/components/src/lib/channel-list-container/channel-list-container.component.ts @@ -28,7 +28,7 @@ import { Store } from '@ngrx/store'; import { StorageMap } from '@ngx-pwa/local-storage'; import { TranslatePipe, TranslateService } from '@ngx-translate/core'; import * as _ from 'lodash'; -import * as PlaylistActions from 'm3u-state'; +import { ChannelActions, FavoritesActions } from 'm3u-state'; import { selectActive, selectActivePlaylistId, @@ -165,7 +165,7 @@ export class ChannelListContainerComponent implements OnInit, OnDestroy { * @param channel selected channel */ selectChannel(channel: Channel): void { - this.store.dispatch(PlaylistActions.setActiveChannel({ channel })); + this.store.dispatch(ChannelActions.setActiveChannel({ channel })); // Use tvg-id for EPG matching, fallback to channel name if not available const epgChannelId = channel?.tvg?.id?.trim() || channel?.name.trim(); @@ -187,7 +187,7 @@ export class ChannelListContainerComponent implements OnInit, OnDestroy { undefined, { duration: 2000 } ); - this.store.dispatch(PlaylistActions.updateFavorites({ channel })); + this.store.dispatch(FavoritesActions.updateFavorites({ channel })); } trackByFn(_: number, channel: Channel): string { @@ -197,7 +197,7 @@ export class ChannelListContainerComponent implements OnInit, OnDestroy { drop(event: CdkDragDrop, favorites: Channel[]) { moveItemInArray(favorites, event.previousIndex, event.currentIndex); this.store.dispatch( - PlaylistActions.setFavorites({ + FavoritesActions.setFavorites({ channelIds: favorites.map((item) => item.url), }) ); @@ -230,7 +230,7 @@ export class ChannelListContainerComponent implements OnInit, OnDestroy { } ngOnDestroy() { - this.store.dispatch(PlaylistActions.setChannels({ channels: [] })); + this.store.dispatch(ChannelActions.setChannels({ channels: [] })); if (this.epgRefreshInterval) { clearInterval(this.epgRefreshInterval); 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 434d5716f..830e2f9c3 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 @@ -8,11 +8,8 @@ import { MomentDatePipe } from '@iptvnator/pipes'; import { Store } from '@ngrx/store'; import { TranslatePipe } from '@ngx-translate/core'; import { - resetActiveEpgProgram, selectActive, - setActiveEpgProgram, - setCurrentEpgProgram, - setEpgAvailableFlag, + EpgActions, } from 'm3u-state'; import moment from 'moment'; import { BehaviorSubject, combineLatest, map } from 'rxjs'; @@ -157,7 +154,7 @@ export class EpgListComponent implements OnInit { // Dispatch EPG availability flag this.store.dispatch( - setEpgAvailableFlag({ value: programs.length > 0 }) + EpgActions.setEpgAvailableFlag({ value: programs.length > 0 }) ); if (programs.length > 0) { @@ -165,7 +162,7 @@ export class EpgListComponent implements OnInit { } else { this.channel = {} as EpgChannel; // Clear the current EPG program when no programs available - this.store.dispatch(resetActiveEpgProgram()); + this.store.dispatch(EpgActions.resetActiveEpgProgram()); } // Trigger change detection for OnPush strategy @@ -223,7 +220,7 @@ export class EpgListComponent implements OnInit { // Always dispatch the action, even when playingNow is null/undefined // This ensures the store is updated and old EPG data is cleared this.store.dispatch( - setCurrentEpgProgram({ program: this.playingNow }) + EpgActions.setCurrentEpgProgram({ program: this.playingNow }) ); // Trigger change detection for OnPush strategy this.cdr.markForCheck(); @@ -242,10 +239,10 @@ export class EpgListComponent implements OnInit { timeshift?: boolean ): void { if (isLive) { - this.store.dispatch(resetActiveEpgProgram()); + this.store.dispatch(EpgActions.resetActiveEpgProgram()); } else { if (!timeshift) return; - this.store.dispatch(setActiveEpgProgram({ program })); + this.store.dispatch(EpgActions.setActiveEpgProgram({ program })); } this.playingNow = program; // Trigger change detection for OnPush strategy diff --git a/libs/ui/components/src/lib/recent-playlists/playlist-info/playlist-info.component.ts b/libs/ui/components/src/lib/recent-playlists/playlist-info/playlist-info.component.ts index 495e16f1d..61a674046 100644 --- a/libs/ui/components/src/lib/recent-playlists/playlist-info/playlist-info.component.ts +++ b/libs/ui/components/src/lib/recent-playlists/playlist-info/playlist-info.component.ts @@ -17,7 +17,7 @@ import { MatSnackBar } from '@angular/material/snack-bar'; import { MatTooltip } from '@angular/material/tooltip'; import { Store } from '@ngrx/store'; import { TranslatePipe, TranslateService } from '@ngx-translate/core'; -import * as PlaylistActions from 'm3u-state'; +import { PlaylistActions } from 'm3u-state'; import { firstValueFrom } from 'rxjs'; import { DatabaseService, PlaylistsService } from 'services'; import { Playlist, PlaylistMeta } from 'shared-interfaces'; 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 408c98a13..a87fdcc1a 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 @@ -9,7 +9,7 @@ import { MatSnackBar } from '@angular/material/snack-bar'; import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; import { TranslatePipe, TranslateService } from '@ngx-translate/core'; -import * as PlaylistActions from 'm3u-state'; +import { PlaylistActions } from 'm3u-state'; import { selectActiveTypeFilters, selectAllPlaylistsMeta, 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 00956209d..6fca98c18 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 @@ -6,7 +6,7 @@ import { MatTooltip } from '@angular/material/tooltip'; import { Router, RouterLink } from '@angular/router'; import { Store } from '@ngrx/store'; import { TranslatePipe } from '@ngx-translate/core'; -import * as PlaylistActions from 'm3u-state'; +import { ChannelActions } from 'm3u-state'; import { selectPlaylistTitle } from 'm3u-state'; import { Channel, SidebarView } from 'shared-interfaces'; import { RecentPlaylistsComponent } from '../../recent-playlists/recent-playlists.component'; @@ -38,7 +38,7 @@ export class SidebarComponent { goBack() { if (this.sidebarView === 'PLAYLISTS') { - this.store.dispatch(PlaylistActions.resetActiveChannel()); + this.store.dispatch(ChannelActions.resetActiveChannel()); this.router.navigate(['/']); } else { this.sidebarView = 'PLAYLISTS'; diff --git a/libs/ui/components/src/lib/video-player/toolbar/toolbar.component.ts b/libs/ui/components/src/lib/video-player/toolbar/toolbar.component.ts index e29e75479..b0258fd48 100644 --- a/libs/ui/components/src/lib/video-player/toolbar/toolbar.component.ts +++ b/libs/ui/components/src/lib/video-player/toolbar/toolbar.component.ts @@ -11,7 +11,7 @@ import { selectActivePlaylistId, selectFavorites, selectIsEpgAvailable, - updateFavorites, + FavoritesActions, } from 'm3u-state'; import { Channel } from 'shared-interfaces'; @@ -46,6 +46,6 @@ export class ToolbarComponent { readonly playlistId$ = this.store.select(selectActivePlaylistId); updateFavoriteStatus(channel: Channel) { - this.store.dispatch(updateFavorites({ channel })); + this.store.dispatch(FavoritesActions.updateFavorites({ channel })); } }