UNPKG

unified-video-framework

Version:

Cross-platform video player framework supporting iOS, Android, Web, Smart TVs (Samsung/LG), Roku, and more

232 lines 9.15 kB
export class UserPreferencesManager { constructor(initialPreferences) { this.listeners = []; this.preferences = this.loadPreferences(); if (initialPreferences) { this.updatePreferences(initialPreferences); } } getPreferences() { return { ...this.preferences }; } updatePreferences(updates) { const oldPreferences = { ...this.preferences }; this.preferences = { ...this.preferences, ...updates }; if (this.preferences.rememberChoices) { this.savePreferences(); } if (!this.preferencesEqual(oldPreferences, this.preferences)) { this.notifyListeners(); } } resetPreferences() { this.preferences = { ...UserPreferencesManager.DEFAULT_PREFERENCES }; this.savePreferences(); this.notifyListeners(); } getPreference(key) { return this.preferences[key]; } setPreference(key, value) { this.updatePreferences({ [key]: value }); } toggleAutoSkip(segmentType) { switch (segmentType) { case 'intro': this.setPreference('autoSkipIntro', !this.preferences.autoSkipIntro); break; case 'recap': this.setPreference('autoSkipRecap', !this.preferences.autoSkipRecap); break; case 'credits': this.setPreference('autoSkipCredits', !this.preferences.autoSkipCredits); break; } } isAutoSkipEnabled(segmentType) { switch (segmentType) { case 'intro': return this.preferences.autoSkipIntro || false; case 'recap': return this.preferences.autoSkipRecap || false; case 'credits': return this.preferences.autoSkipCredits || false; default: return false; } } addListener(listener) { this.listeners.push(listener); } removeListener(listener) { const index = this.listeners.indexOf(listener); if (index > -1) { this.listeners.splice(index, 1); } } createPreferencesPanel() { const panel = document.createElement('div'); panel.className = 'uvf-chapter-preferences-panel'; panel.innerHTML = ` <div class="uvf-preferences-header"> <h3>Skip Preferences</h3> </div> <div class="uvf-preferences-body"> <div class="uvf-preference-item"> <label> <input type="checkbox" id="uvf-pref-auto-skip-intro" ${this.preferences.autoSkipIntro ? 'checked' : ''}> <span>Auto-skip intros</span> </label> </div> <div class="uvf-preference-item"> <label> <input type="checkbox" id="uvf-pref-auto-skip-recap" ${this.preferences.autoSkipRecap ? 'checked' : ''}> <span>Auto-skip recaps</span> </label> </div> <div class="uvf-preference-item"> <label> <input type="checkbox" id="uvf-pref-auto-skip-credits" ${this.preferences.autoSkipCredits ? 'checked' : ''}> <span>Auto-skip credits</span> </label> </div> <div class="uvf-preference-item"> <label> <input type="checkbox" id="uvf-pref-show-buttons" ${this.preferences.showSkipButtons ? 'checked' : ''}> <span>Show skip buttons</span> </label> </div> <div class="uvf-preference-item"> <label> <span>Button timeout:</span> <select id="uvf-pref-timeout"> <option value="3000" ${this.preferences.skipButtonTimeout === 3000 ? 'selected' : ''}>3 seconds</option> <option value="5000" ${this.preferences.skipButtonTimeout === 5000 ? 'selected' : ''}>5 seconds</option> <option value="10000" ${this.preferences.skipButtonTimeout === 10000 ? 'selected' : ''}>10 seconds</option> <option value="0" ${this.preferences.skipButtonTimeout === 0 ? 'selected' : ''}>Never hide</option> </select> </label> </div> <div class="uvf-preference-item"> <label> <input type="checkbox" id="uvf-pref-remember" ${this.preferences.rememberChoices ? 'checked' : ''}> <span>Remember preferences</span> </label> </div> </div> <div class="uvf-preferences-footer"> <button type="button" id="uvf-pref-reset">Reset to Defaults</button> </div> `; this.setupPreferencesEventListeners(panel); return panel; } loadPreferences() { try { const stored = localStorage.getItem(UserPreferencesManager.STORAGE_KEY); if (stored) { const parsed = JSON.parse(stored); return { ...UserPreferencesManager.DEFAULT_PREFERENCES, ...parsed }; } } catch (error) { console.warn('Failed to load chapter preferences from storage:', error); } return { ...UserPreferencesManager.DEFAULT_PREFERENCES }; } savePreferences() { try { localStorage.setItem(UserPreferencesManager.STORAGE_KEY, JSON.stringify(this.preferences)); } catch (error) { console.warn('Failed to save chapter preferences to storage:', error); } } preferencesEqual(a, b) { return (a.autoSkipIntro === b.autoSkipIntro && a.autoSkipRecap === b.autoSkipRecap && a.autoSkipCredits === b.autoSkipCredits && a.showSkipButtons === b.showSkipButtons && a.skipButtonTimeout === b.skipButtonTimeout && a.rememberChoices === b.rememberChoices); } notifyListeners() { this.listeners.forEach(listener => { try { listener(this.getPreferences()); } catch (error) { console.error('Error in preference change listener:', error); } }); } setupPreferencesEventListeners(panel) { const autoSkipIntro = panel.querySelector('#uvf-pref-auto-skip-intro'); const autoSkipRecap = panel.querySelector('#uvf-pref-auto-skip-recap'); const autoSkipCredits = panel.querySelector('#uvf-pref-auto-skip-credits'); const showButtons = panel.querySelector('#uvf-pref-show-buttons'); const remember = panel.querySelector('#uvf-pref-remember'); const timeout = panel.querySelector('#uvf-pref-timeout'); const resetButton = panel.querySelector('#uvf-pref-reset'); if (autoSkipIntro) { autoSkipIntro.addEventListener('change', () => { this.setPreference('autoSkipIntro', autoSkipIntro.checked); }); } if (autoSkipRecap) { autoSkipRecap.addEventListener('change', () => { this.setPreference('autoSkipRecap', autoSkipRecap.checked); }); } if (autoSkipCredits) { autoSkipCredits.addEventListener('change', () => { this.setPreference('autoSkipCredits', autoSkipCredits.checked); }); } if (showButtons) { showButtons.addEventListener('change', () => { this.setPreference('showSkipButtons', showButtons.checked); }); } if (remember) { remember.addEventListener('change', () => { this.setPreference('rememberChoices', remember.checked); }); } if (timeout) { timeout.addEventListener('change', () => { this.setPreference('skipButtonTimeout', parseInt(timeout.value, 10)); }); } if (resetButton) { resetButton.addEventListener('click', () => { this.resetPreferences(); if (autoSkipIntro) autoSkipIntro.checked = this.preferences.autoSkipIntro || false; if (autoSkipRecap) autoSkipRecap.checked = this.preferences.autoSkipRecap || false; if (autoSkipCredits) autoSkipCredits.checked = this.preferences.autoSkipCredits || false; if (showButtons) showButtons.checked = this.preferences.showSkipButtons || true; if (remember) remember.checked = this.preferences.rememberChoices || true; if (timeout) timeout.value = String(this.preferences.skipButtonTimeout || 5000); }); } } static getDefaultPreferences() { return { ...UserPreferencesManager.DEFAULT_PREFERENCES }; } } UserPreferencesManager.STORAGE_KEY = 'uvf_chapter_preferences'; UserPreferencesManager.DEFAULT_PREFERENCES = { autoSkipIntro: false, autoSkipRecap: false, autoSkipCredits: false, showSkipButtons: true, skipButtonTimeout: 5000, rememberChoices: true }; //# sourceMappingURL=UserPreferencesManager.js.map