90 lines
2.3 KiB
TypeScript
90 lines
2.3 KiB
TypeScript
import { Injectable } from '@angular/core';
|
|
import {
|
|
getXtreamPendingRestoreStorageKey,
|
|
XtreamPendingRestoreState,
|
|
} from 'shared-interfaces';
|
|
|
|
const EMPTY_RESTORE_STATE: XtreamPendingRestoreState = {
|
|
hiddenCategories: [],
|
|
favorites: [],
|
|
recentlyViewed: [],
|
|
playbackPositions: [],
|
|
};
|
|
|
|
@Injectable({
|
|
providedIn: 'root',
|
|
})
|
|
export class XtreamPendingRestoreService {
|
|
get(playlistId: string): XtreamPendingRestoreState | null {
|
|
if (!playlistId) {
|
|
return null;
|
|
}
|
|
|
|
try {
|
|
const rawState = localStorage.getItem(
|
|
getXtreamPendingRestoreStorageKey(playlistId)
|
|
);
|
|
|
|
if (!rawState) {
|
|
return null;
|
|
}
|
|
|
|
return this.normalize(JSON.parse(rawState));
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
set(playlistId: string, state: XtreamPendingRestoreState): void {
|
|
if (!playlistId) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
localStorage.setItem(
|
|
getXtreamPendingRestoreStorageKey(playlistId),
|
|
JSON.stringify(this.normalize(state))
|
|
);
|
|
} catch {
|
|
// Ignore local storage write failures.
|
|
}
|
|
}
|
|
|
|
clear(playlistId: string): void {
|
|
if (!playlistId) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
localStorage.removeItem(
|
|
getXtreamPendingRestoreStorageKey(playlistId)
|
|
);
|
|
} catch {
|
|
// Ignore local storage remove failures.
|
|
}
|
|
}
|
|
|
|
private normalize(value: unknown): XtreamPendingRestoreState {
|
|
if (!value || typeof value !== 'object') {
|
|
return { ...EMPTY_RESTORE_STATE };
|
|
}
|
|
|
|
const candidate = value as Partial<XtreamPendingRestoreState>;
|
|
|
|
return {
|
|
hiddenCategories: Array.isArray(candidate.hiddenCategories)
|
|
? candidate.hiddenCategories
|
|
: [],
|
|
favorites: Array.isArray(candidate.favorites)
|
|
? candidate.favorites
|
|
: [],
|
|
recentlyViewed: Array.isArray(candidate.recentlyViewed)
|
|
? candidate.recentlyViewed
|
|
: [],
|
|
playbackPositions: Array.isArray(candidate.playbackPositions)
|
|
? candidate.playbackPositions
|
|
: [],
|
|
};
|
|
}
|
|
}
|