mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-13 20:56:19 -08:00
Update default remote control port from 3000 to 8765 in settings store and component initialization to avoid conflicts with common development ports and align with the desktop/tauri environment. Unhide and scope the remote control UI to desktop builds only: - Restore the remote control block in settings template and guard it with @if (isDesktop) so the checkbox and description render for desktop users (previously commented out as not ported). - Keep the remote control settings section conditionally visible when the remoteControl form value is true. These changes ensure desktop users can configure and enable the remote control feature with a non-conflicting default port.
102 lines
2.9 KiB
TypeScript
102 lines
2.9 KiB
TypeScript
import { inject } from '@angular/core';
|
|
import {
|
|
patchState,
|
|
signalStore,
|
|
withHooks,
|
|
withMethods,
|
|
withState,
|
|
} from '@ngrx/signals';
|
|
import { StorageMap } from '@ngx-pwa/local-storage';
|
|
import { firstValueFrom } from 'rxjs';
|
|
import {
|
|
Language,
|
|
Settings,
|
|
STORE_KEY,
|
|
StreamFormat,
|
|
Theme,
|
|
VideoPlayer,
|
|
} from 'shared-interfaces';
|
|
|
|
const DEFAULT_SETTINGS: Settings = {
|
|
player: VideoPlayer.VideoJs,
|
|
streamFormat: StreamFormat.M3u8StreamFormat,
|
|
language: Language.ENGLISH,
|
|
showCaptions: false,
|
|
theme: Theme.LightTheme,
|
|
mpvPlayerPath: '',
|
|
mpvReuseInstance: false,
|
|
vlcPlayerPath: '',
|
|
remoteControl: false,
|
|
remoteControlPort: 8765,
|
|
epgUrl: [],
|
|
};
|
|
|
|
export const SettingsStore = signalStore(
|
|
{ providedIn: 'root' },
|
|
withState<Settings>(DEFAULT_SETTINGS),
|
|
withMethods((store, storage = inject(StorageMap)) => ({
|
|
async loadSettings() {
|
|
try {
|
|
const stored = await firstValueFrom(
|
|
storage.get(STORE_KEY.Settings)
|
|
);
|
|
if (stored) {
|
|
patchState(store, {
|
|
...DEFAULT_SETTINGS,
|
|
...(stored as Settings),
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to load settings:', error);
|
|
// Keep default settings if loading fails
|
|
}
|
|
},
|
|
|
|
async updateSettings(settings: Partial<Settings>) {
|
|
patchState(store, settings);
|
|
// Save the complete settings object, not just the partial update
|
|
const completeSettings = this.getSettings();
|
|
try {
|
|
await firstValueFrom(
|
|
storage.set(STORE_KEY.Settings, completeSettings)
|
|
);
|
|
} catch (error) {
|
|
console.error('Failed to save settings:', error);
|
|
throw error;
|
|
}
|
|
},
|
|
|
|
getSettings() {
|
|
return {
|
|
player: store.player(),
|
|
streamFormat: store.streamFormat(),
|
|
language: store.language(),
|
|
showCaptions: store.showCaptions(),
|
|
theme: store.theme(),
|
|
mpvPlayerPath: store.mpvPlayerPath(),
|
|
mpvReuseInstance: store.mpvReuseInstance(),
|
|
vlcPlayerPath: store.vlcPlayerPath(),
|
|
remoteControl: store.remoteControl(),
|
|
remoteControlPort: store.remoteControlPort(),
|
|
epgUrl: store.epgUrl(),
|
|
};
|
|
},
|
|
|
|
getPlayer() {
|
|
return store.player();
|
|
},
|
|
|
|
isEmbeddedPlayer() {
|
|
return (
|
|
store.player() === VideoPlayer.VideoJs ||
|
|
store.player() === VideoPlayer.Html5Player
|
|
);
|
|
},
|
|
})),
|
|
withHooks({
|
|
onInit(store) {
|
|
store.loadSettings();
|
|
},
|
|
})
|
|
);
|