mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-13 04:26:16 -08:00
* fix(migration): show startup preparation and recover source read failures * fix(migration): keep inventory reload failures recoverable * test(migration): type the deferred recovery hook * fix(migration): reconcile failed EPG cleanup before recovery * fix(migration): await settings before inventory readiness * style(migration): add a subtle theme-aware startup watermark
116 lines
3.2 KiB
TypeScript
116 lines
3.2 KiB
TypeScript
import { createFeatureSelector, createSelector } from '@ngrx/store';
|
|
import { Playlist } from '@iptvnator/shared/interfaces';
|
|
import * as fromPlaylistMetaState from './playlists.state';
|
|
import * as fromPlaylistState from './reducers';
|
|
import { PlaylistState } from './state';
|
|
|
|
export const selectPlaylistState =
|
|
createFeatureSelector<PlaylistState>('playlistState');
|
|
|
|
export const selectIsEpgAvailable = createSelector(
|
|
selectPlaylistState,
|
|
fromPlaylistState.selectIsEpgAvailableReducer
|
|
);
|
|
|
|
export const selectActive = createSelector(
|
|
selectPlaylistState,
|
|
fromPlaylistState.selectActiveReducer
|
|
);
|
|
|
|
export const selectActivePlaybackUrl = createSelector(
|
|
selectPlaylistState,
|
|
fromPlaylistState.selectActivePlaybackUrlReducer
|
|
);
|
|
|
|
export const selectActiveEpgProgram = createSelector(
|
|
selectPlaylistState,
|
|
fromPlaylistState.selectActiveEpgProgramReducer
|
|
);
|
|
|
|
export const selectCurrentEpgProgram = createSelector(
|
|
selectPlaylistState,
|
|
fromPlaylistState.selectCurrentEpgProgramReducer
|
|
);
|
|
|
|
export const selectChannelsLoading = createSelector(
|
|
selectPlaylistState,
|
|
fromPlaylistState.selectChannelsLoadingReducer
|
|
);
|
|
|
|
export const selectChannels = createSelector(
|
|
selectPlaylistState,
|
|
fromPlaylistState.selectChannelsReducer
|
|
);
|
|
|
|
export const selectPlaylistsLoadingFlag = createSelector(
|
|
selectPlaylistState,
|
|
fromPlaylistState.selectPlaylistsLoadingFlagReducer
|
|
);
|
|
|
|
/** Playlist entity store selectors */
|
|
export const selectPlaylistsMetaState = createSelector(
|
|
selectPlaylistState,
|
|
fromPlaylistState.selectPlaylists
|
|
);
|
|
|
|
export const selectPlaylistsLoadFailed = createSelector(
|
|
selectPlaylistsMetaState,
|
|
(state) => state.loadFailed === true
|
|
);
|
|
|
|
export const selectAllPlaylistsMeta = createSelector(
|
|
selectPlaylistsMetaState,
|
|
fromPlaylistMetaState.getAllPlaylistsMeta
|
|
);
|
|
|
|
export const selectActiveTypeFilters = createSelector(
|
|
selectPlaylistsMetaState,
|
|
(state) => state.selectedFilters
|
|
);
|
|
|
|
export const selectPlaylistEntity = (id: string) =>
|
|
createSelector(selectPlaylistEntities, (entities) => entities[id]);
|
|
|
|
export const selectActivePlaylistId = createSelector(
|
|
selectPlaylistsMetaState,
|
|
(state) => state.selectedId
|
|
);
|
|
|
|
export const selectPlaylistEntities = createSelector(
|
|
selectPlaylistsMetaState,
|
|
fromPlaylistMetaState.getPlaylistMetaEntities
|
|
);
|
|
|
|
export const selectActivePlaylist = createSelector(
|
|
selectPlaylistEntities,
|
|
selectActivePlaylistId,
|
|
(entities, activePlaylistId) => {
|
|
if (!entities || !activePlaylistId) {
|
|
return null;
|
|
}
|
|
|
|
return entities[activePlaylistId] ?? null;
|
|
}
|
|
);
|
|
|
|
export const selectPlaylistTitle = createSelector(
|
|
selectActivePlaylist,
|
|
(playlist) => playlist?.title || playlist?.filename || 'Untitled playlist'
|
|
);
|
|
|
|
export const selectPlaylistById = (id: string) =>
|
|
createSelector(selectPlaylistEntities, (entities) => {
|
|
if (entities) {
|
|
return entities[id] as Playlist;
|
|
}
|
|
return null;
|
|
});
|
|
|
|
export const selectFavorites = createSelector(
|
|
selectActivePlaylist,
|
|
(playlist) =>
|
|
(playlist?.favorites || []).filter(
|
|
(favorite): favorite is string => typeof favorite === 'string'
|
|
)
|
|
);
|