Primera versión estable v1.1.5 - Aulas UNICABA

This commit is contained in:
2026-03-25 16:50:25 -03:00
commit d3243c0166
143 changed files with 22908 additions and 0 deletions
+126
View File
@@ -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;
}
}
}