Primera versión estable v1.1.5 - Aulas UNICABA
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { Filesystem, Directory, Encoding } from '@capacitor/filesystem';
|
||||
import { FilePicker } from '@capawesome/capacitor-file-picker';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class CsvStorageService {
|
||||
|
||||
private readonly FILE_NAME = 'aulas_unicaba_datos.csv';
|
||||
|
||||
constructor() {}
|
||||
|
||||
private async ensurePermissions(): Promise<boolean> {
|
||||
try {
|
||||
let status = await Filesystem.checkPermissions();
|
||||
if (status.publicStorage !== 'granted') {
|
||||
status = await Filesystem.requestPermissions();
|
||||
}
|
||||
return status.publicStorage === 'granted';
|
||||
} catch (e) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
async saveFavoritesToCsv(favoritos: string[]) {
|
||||
try {
|
||||
const hasPermission = await this.ensurePermissions();
|
||||
if (!hasPermission) {
|
||||
console.warn('Permisos denegados para escribir en Documents');
|
||||
return;
|
||||
}
|
||||
|
||||
let csvContent = 'tipo,valor\n';
|
||||
favoritos.forEach(codigo => {
|
||||
csvContent += `favorito,${codigo}\n`;
|
||||
});
|
||||
|
||||
// Intentamos borrar si existe para forzar la actualización transparente en Scoped Storage
|
||||
try {
|
||||
await Filesystem.deleteFile({
|
||||
path: this.FILE_NAME,
|
||||
directory: Directory.Documents
|
||||
});
|
||||
} catch (e) {}
|
||||
|
||||
await Filesystem.writeFile({
|
||||
path: this.FILE_NAME,
|
||||
data: csvContent,
|
||||
directory: Directory.Documents,
|
||||
encoding: Encoding.UTF8
|
||||
});
|
||||
console.log('CSV guardado exitosamente en Documents');
|
||||
} catch (e) {
|
||||
console.error('Error al guardar el CSV:', e);
|
||||
}
|
||||
}
|
||||
|
||||
async loadFavoritesFromCsv(): Promise<string[] | null> {
|
||||
try {
|
||||
const hasPermission = await this.ensurePermissions();
|
||||
if (!hasPermission) return null;
|
||||
|
||||
const contents = await Filesystem.readFile({
|
||||
path: this.FILE_NAME,
|
||||
directory: Directory.Documents,
|
||||
encoding: Encoding.UTF8
|
||||
});
|
||||
|
||||
if (!contents.data) return null;
|
||||
|
||||
const lines = contents.data.toString().split('\n');
|
||||
const favs: string[] = [];
|
||||
|
||||
for (let i = 1; i < lines.length; i++) {
|
||||
const line = lines[i].trim();
|
||||
if (line.startsWith('favorito,')) {
|
||||
const parts = line.split(',');
|
||||
if (parts.length > 1 && parts[1]) {
|
||||
favs.push(parts[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return favs.length > 0 ? favs : null;
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async importFavoritesFromFilePicker(): Promise<string[] | null> {
|
||||
try {
|
||||
const result = await FilePicker.pickFiles({
|
||||
types: ['text/csv', 'text/comma-separated-values', '.csv'],
|
||||
readData: true
|
||||
});
|
||||
|
||||
const file = result.files[0];
|
||||
if (!file || !file.data) return null;
|
||||
|
||||
const text = decodeURIComponent(escape(window.atob(file.data)));
|
||||
|
||||
const lines = text.split('\n');
|
||||
const favs: string[] = [];
|
||||
|
||||
for (let i = 1; i < lines.length; i++) {
|
||||
const line = lines[i].trim();
|
||||
if (line.startsWith('favorito,')) {
|
||||
const parts = line.split(',');
|
||||
if (parts.length > 1 && parts[1]) {
|
||||
favs.push(parts[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (favs.length > 0) {
|
||||
await this.saveFavoritesToCsv(favs);
|
||||
return favs;
|
||||
}
|
||||
return null;
|
||||
} catch(e) {
|
||||
console.warn('File picker cancelado o falló', e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user