2022-06-15 20:24:56 +02:00

245 lines
6.6 KiB
TypeScript

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { ServerDto } from '../_dto/ServerDto';
import { StoredDataDto } from '../_dto/StoredDataDto';
@Injectable({
providedIn: 'root'
})
export class StorageService {
//BehaviorSubjects for latest settings values
public widerViewportSubject = new BehaviorSubject<boolean>(false);
constructor() {
this.initializeLocalStorage();
}
/**
* Initialize settings
*/
private initializeLocalStorage(): void {
//If undefined, initialize localStorage
if (typeof window.localStorage["WebConsole"] === 'undefined') {
//Create empty object
var storageObj: StoredDataDto = {
servers: [],
language: "",
settings: {
dateTimePrefix: true,
retrieveLogFile: true,
blurryUri: false,
widerViewport: false
}
};
//Save to WebStorage
window.localStorage["WebConsole"] = JSON.stringify(storageObj);
}
//Initialize BehaviorSubjects
this.widerViewportSubject.next(this.getSetting(SettingsEnum.WiderViewport));
}
/**
* Get a list of all saved servers
* @returns List of all servers saved
*/
public getAllServers(): ServerDto[] {
var storageObj = JSON.parse(window.localStorage["WebConsole"]) as StoredDataDto;
return storageObj.servers;
}
/**
* Get server info given its name
* @param serverName Server name
* @returns Server details, null if not found
*/
public getServer(serverName: string): ServerDto | undefined {
return this.getAllServers().find(e => e.serverName == serverName);
}
/**
* Save a new server or, in case a server with same name already exists, update it.
* @param serverName Name of the server to add or update
* @param serverUri URI of the server
*/
public saveServer(serverName: string, serverUri: string, serverPassword?: string): void {
//Get all saved servers
let servers = this.getAllServers();
let server = servers.find(e => e.serverName == serverName);
if (server) {
//If server exists, update it
(server as ServerDto).serverURI = serverUri;
if (serverPassword)
(server as ServerDto).serverPassword = serverPassword;
else if (serverPassword == null)
(server as ServerDto).serverPassword = undefined;
} else {
//If it does not exist, add to the array
const serverToSave: ServerDto = {
serverName: serverName,
serverURI: serverUri,
serverPassword: serverPassword
}
servers.push(serverToSave);
}
//Overwrite array
this.replaceAllServers(servers);
}
moveServerToIndex(serverName: string, newIndex: number): void {
//Prevent moving if index is not valid
const listOfServers: ServerDto[] = this.getAllServers();
if (newIndex < 0 || newIndex >= listOfServers.length) {
return;
}
//Prevent moving if server does not exist
const serverIndex = listOfServers.findIndex(e => e.serverName == serverName);
if (serverIndex === -1)
return;
//Move server
const serverToMove: ServerDto = listOfServers.find(e => e.serverName == serverName) as ServerDto;
listOfServers.splice(serverIndex, 1); //Remove element from its current position
listOfServers.splice(newIndex, 0, serverToMove); //Inject element in new position
this.replaceAllServers(listOfServers);
}
/**
* Delete a server given its name
* @param serverName Name of the server
*/
public deleteServer(serverName: string): void {
//Get all servers
var servers = this.getAllServers();
//Delete it
servers = servers.filter(e => e.serverName != serverName)
//Save to LocalStorage
this.replaceAllServers(servers);
}
/**
* Save to persistence a new default language
* @param lang Language to set
*/
public setLanguage(lang: string): void {
//Retrieve saved data
var storageObj = JSON.parse(window.localStorage["WebConsole"]) as StoredDataDto;
storageObj.language = lang;
//Save to WebStorage
window.localStorage["WebConsole"] = JSON.stringify(storageObj);
}
/**
* Get saved language
* @returns Language saved
*/
public getLanguage(): string {
var storageObj = JSON.parse(window.localStorage["WebConsole"]) as StoredDataDto;
if (!storageObj.language)
return "en_US";
return storageObj.language;
}
/**
* Replace ALL servers with the provided server list
* @param newServerList New server list
*/
private replaceAllServers(newServerList: ServerDto[]) {
//Retrieve saved data
let storageObj = JSON.parse(window.localStorage["WebConsole"]) as StoredDataDto;
storageObj.servers = newServerList;
//Save to WebStorage
window.localStorage["WebConsole"] = JSON.stringify(storageObj);
}
/**
* Update setting value
* @param setting Setting to set
* @param value Value to set
*/
public setSetting(setting: SettingsEnum, value: any) {
let currentSettings = JSON.parse(window.localStorage["WebConsole"]) as StoredDataDto;
switch (setting) {
case SettingsEnum.DateTimePrefix:
currentSettings.settings.dateTimePrefix = value;
break;
case SettingsEnum.RetrieveLogFile:
currentSettings.settings.retrieveLogFile = value;
break;
case SettingsEnum.BlurryUri:
currentSettings.settings.blurryUri = value;
break;
case SettingsEnum.WiderViewport:
currentSettings.settings.widerViewport = value;
this.widerViewportSubject.next(value);
break;
}
//Save all
let storageObj = JSON.parse(window.localStorage["WebConsole"]);
storageObj.settings = currentSettings.settings;
window.localStorage["WebConsole"] = JSON.stringify(storageObj);
}
/**
* Get a setting
* @param setting Setting to get
* @returns Settings value
*/
public getSetting(setting: SettingsEnum) {
let currentSettings = JSON.parse(window.localStorage["WebConsole"]) as StoredDataDto;
switch (setting) {
case SettingsEnum.DateTimePrefix:
return currentSettings.settings.dateTimePrefix;
case SettingsEnum.RetrieveLogFile:
return currentSettings.settings.retrieveLogFile;
case SettingsEnum.BlurryUri:
return currentSettings.settings.blurryUri;
case SettingsEnum.WiderViewport:
return currentSettings.settings.widerViewport;
}
}
/**
* Import settings from a Base64-encoded JSON
* @param base64settings Encoded settings
* @returns True if imported successfully, false otherwise
*/
public importSettings(base64settings: string): boolean {
try {
const decodedJsonSettings = atob(base64settings);
window.localStorage["WebConsole"] = decodedJsonSettings;
return true;
} catch (e) {
return false;
}
}
/**
* Export settings
* @returns A Base64-encoded JSON containing settings
*/
public getExportString(): string {
return btoa(window.localStorage["WebConsole"]);
}
}
export enum SettingsEnum {
DateTimePrefix,
RetrieveLogFile,
BlurryUri,
WiderViewport
}