mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-14 13:16:16 -08:00
- Added `GlobalFavoritesListComponent` to display and manage favorite channels. - Integrated drag-and-drop functionality for reordering favorite channels. - Created HTML and SCSS files for the global favorites list layout and styling. - Implemented logic to handle empty states and search functionality within the favorites list. feat: Enhance unified collection page with live and grid tabs - Developed `UnifiedCollectionPageComponent` to manage different content types (live, movies, series). - Added `UnifiedGridTabComponent` and `UnifiedLiveTabComponent` for displaying content in grid and live formats. - Implemented loading states and empty states for better user experience. - Integrated EPG (Electronic Program Guide) functionality for live channels. style: Refactor styles for unified collection components - Updated SCSS styles for `UnifiedGridTabComponent` and `UnifiedLiveTabComponent` to improve layout and responsiveness. - Added skeleton loading states for better visual feedback during data fetching. fix: Improve scrolling behavior in category view component - Adjusted scrolling logic in `CategoryViewComponent` to ensure selected categories are centered in the view. Entire-Checkpoint: 0e4488af6c76
119 lines
4.4 KiB
TypeScript
119 lines
4.4 KiB
TypeScript
import {
|
|
HttpClient,
|
|
provideHttpClient,
|
|
withInterceptorsFromDi,
|
|
} from '@angular/common/http';
|
|
import {
|
|
ApplicationConfig,
|
|
importProvidersFrom,
|
|
provideZoneChangeDetection,
|
|
} from '@angular/core';
|
|
import { provideAnimations } from '@angular/platform-browser/animations';
|
|
import { provideRouter, withComponentInputBinding } from '@angular/router';
|
|
import { provideServiceWorker } from '@angular/service-worker';
|
|
import { provideEffects } from '@ngrx/effects';
|
|
import { provideRouterStore, routerReducer } from '@ngrx/router-store';
|
|
import { provideStore } from '@ngrx/store';
|
|
import { provideStoreDevtools } from '@ngrx/store-devtools';
|
|
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
|
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
|
import { PlaylistEffects, playlistReducer } from 'm3u-state';
|
|
import { NgxIndexedDBModule, NgxIndexedDBService } from 'ngx-indexed-db';
|
|
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
|
|
import {
|
|
PORTAL_EXTERNAL_PLAYBACK,
|
|
PORTAL_PLAYER,
|
|
} from '@iptvnator/portal/shared/util';
|
|
import { PLAYLIST_PLAYER_ACTIONS } from '@iptvnator/playlist/shared/util';
|
|
import { provideXtreamDataSource } from '@iptvnator/portal/xtream/data-access';
|
|
import { DataService } from 'services';
|
|
import { dbConfig } from 'shared-interfaces';
|
|
import { AppConfig } from '../environments/environment';
|
|
import { routes } from './app.routes';
|
|
import { ElectronService } from './services/electron.service';
|
|
import { ExternalPlaybackService } from './services/external-playback.service';
|
|
import { PlayerService } from './services/player.service';
|
|
import {
|
|
AppPortalNavigationActionsService,
|
|
providePortalNavigationActions,
|
|
} from './services/portal-navigation-actions.service';
|
|
import { providePortalPlaybackPositions } from './services/portal-playback-positions.service';
|
|
import { PwaService } from './services/pwa.service';
|
|
import { provideWorkspaceShellActions } from './services/workspace-shell-actions.service';
|
|
|
|
// AoT requires an exported function for factories
|
|
export function HttpLoaderFactory(http: HttpClient): TranslateHttpLoader {
|
|
return new TranslateHttpLoader(http, './assets/i18n/', '.json');
|
|
}
|
|
|
|
/**
|
|
* Conditionally provides the necessary service based on the current environment
|
|
*/
|
|
export function DataFactory() {
|
|
if (window.electron) {
|
|
return new ElectronService();
|
|
}
|
|
return new PwaService();
|
|
}
|
|
|
|
export const appConfig: ApplicationConfig = {
|
|
providers: [
|
|
provideZoneChangeDetection({ eventCoalescing: true }),
|
|
provideRouter(routes, withComponentInputBinding()),
|
|
provideAnimations(),
|
|
provideHttpClient(withInterceptorsFromDi()),
|
|
provideStore({
|
|
router: routerReducer,
|
|
playlistState: playlistReducer,
|
|
}),
|
|
provideEffects([PlaylistEffects]),
|
|
provideRouterStore(),
|
|
provideStoreDevtools({
|
|
maxAge: 25,
|
|
logOnly: AppConfig.production,
|
|
}),
|
|
provideServiceWorker('ngsw-worker.js', {
|
|
enabled: AppConfig.production && !!window.electron,
|
|
registrationStrategy: 'registerWhenStable:30000',
|
|
}),
|
|
importProvidersFrom(
|
|
AppConfig.environment === 'WEB'
|
|
? NgxIndexedDBModule.forRoot(dbConfig)
|
|
: [],
|
|
NgxIndexedDBModule.forRoot(dbConfig),
|
|
NgxSkeletonLoaderModule.forRoot({
|
|
animation: 'pulse',
|
|
loadingText: 'This item is actually loading...',
|
|
}),
|
|
TranslateModule.forRoot({
|
|
loader: {
|
|
provide: TranslateLoader,
|
|
useFactory: HttpLoaderFactory,
|
|
deps: [HttpClient],
|
|
},
|
|
})
|
|
),
|
|
{
|
|
provide: DataService,
|
|
useFactory: DataFactory,
|
|
deps: [NgxIndexedDBService, HttpClient],
|
|
},
|
|
{
|
|
provide: PORTAL_PLAYER,
|
|
useExisting: PlayerService,
|
|
},
|
|
{
|
|
provide: PORTAL_EXTERNAL_PLAYBACK,
|
|
useExisting: ExternalPlaybackService,
|
|
},
|
|
...providePortalPlaybackPositions(),
|
|
...providePortalNavigationActions(),
|
|
{
|
|
provide: PLAYLIST_PLAYER_ACTIONS,
|
|
useExisting: AppPortalNavigationActionsService,
|
|
},
|
|
...provideWorkspaceShellActions(),
|
|
...provideXtreamDataSource(),
|
|
],
|
|
};
|