Files
canti/src/app/services/my-canti.service.ts
T

154 lines
4.8 KiB
TypeScript

import { Injectable, signal, inject, Injector } from '@angular/core';
import { Storage } from '@ionic/storage-angular';
import { Canto, CantiService } from './canti.service';
import { ToastController } from '@ionic/angular';
import { environment } from '../../environments/environment';
import { PlaylistService } from './playlist.service';
@Injectable({
providedIn: 'root'
})
export class MyCantiService {
private storage = inject(Storage);
private cantiService = inject(CantiService);
private toastController = inject(ToastController);
private injector = inject(Injector);
private playlistService!: PlaylistService;
private _storage: Storage | null = null;
public myCanti = signal<Canto[]>([]);
private initPromise!: Promise<void>;
constructor() {
this.initPromise = this.init();
}
async init(): Promise<void> {
this._storage = this.cantiService.getStorage();
if (!this._storage) {
return new Promise<void>((resolve) => {
setTimeout(async () => {
await this.init();
resolve();
}, 500);
});
}
const saved = await this._storage.get('my-canti');
if (saved) {
this.myCanti.set(saved);
}
}
async saveCanto(canto: Partial<Canto>): Promise<Canto> {
await this.initPromise;
const current = this.myCanti();
let updated: Canto[];
let targetCanto: Canto;
if (canto.id && canto.id.startsWith('my_')) {
// Update existing song
updated = current.map(c => {
if (c.id === canto.id) {
targetCanto = {
...c,
titolo: canto.titolo || c.titolo,
testo: canto.testo || c.testo,
accordi: canto.accordi !== undefined ? canto.accordi : c.accordi,
autore: canto.autore !== undefined ? canto.autore : c.autore,
link_youtube: canto.link_youtube !== undefined ? canto.link_youtube : c.link_youtube,
id_momenti: canto.id_momenti || c.id_momenti,
durata: canto.durata !== undefined ? canto.durata : c.durata,
bpm: canto.bpm !== undefined ? canto.bpm : c.bpm
};
return targetCanto;
}
return c;
});
// Fallback if not found in list (should not happen normally)
if (!updated.some(c => c.id === canto.id)) {
const numericId = canto.id ? Number(canto.id.replace('my_', '')) : NaN;
const idCanti = isNaN(numericId) ? Date.now() : numericId;
targetCanto = {
id: canto.id,
id_canti: canto.id_canti || idCanti,
titolo: canto.titolo || 'Senza Titolo',
testo: canto.testo || '',
accordi: canto.accordi,
autore: canto.autore,
link_youtube: canto.link_youtube,
id_momenti: canto.id_momenti || [],
durata: canto.durata,
bpm: canto.bpm
};
updated.push(targetCanto);
}
} else {
// Create new song
targetCanto = {
id: `my_${Date.now()}`,
id_canti: Date.now(), // Fake ID for internal logic
titolo: canto.titolo || 'Senza Titolo',
testo: canto.testo || '',
accordi: canto.accordi,
autore: canto.autore,
link_youtube: canto.link_youtube,
id_momenti: canto.id_momenti || [],
durata: canto.durata,
bpm: canto.bpm
};
updated = [...current, targetCanto];
}
this.myCanti.set(updated);
await this._storage?.set('my-canti', updated);
// Sincronizza automaticamente in background
if (!this.playlistService) {
this.playlistService = this.injector.get(PlaylistService);
}
this.playlistService.syncLocalDataToServer();
const toast = await this.toastController.create({
message: 'Canto salvato nei "Miei Canti"!',
duration: 2000,
color: 'success'
});
toast.present();
return targetCanto!;
}
async deleteCanto(id: string) {
await this.initPromise;
const updated = this.myCanti().filter(c => c.id !== id);
this.myCanti.set(updated);
await this._storage?.set('my-canti', updated);
// Sincronizza automaticamente in background
if (!this.playlistService) {
this.playlistService = this.injector.get(PlaylistService);
}
this.playlistService.syncLocalDataToServer();
}
async sendAllMyCanti() {
const data = {
version: new Date().toISOString(),
canti: this.myCanti()
};
const body = JSON.stringify(data, null, 2);
const subject = `Proposta Collection Canti: ${this.myCanti().length} brani`;
const mailtoUrl = `mailto:${environment.contactEmail}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`;
window.location.href = mailtoUrl;
const toast = await this.toastController.create({
message: 'Email generata con il JSON dei tuoi canti.',
duration: 3000,
color: 'secondary'
});
toast.present();
}
}