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
JavaScript
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