feat: integrato il supporto ai canti personalizzati (non validati) della parrocchia

- Recuperato il campo 'canti_personali' dalle tabelle dell'API parrocchiale.
- Mappato ed integrato il segnale 'comunitaCantiPersonali' in locale e salvato su localStorage.
- Permesso il caricamento e l'interrogazione corretta dei brani custom in HomePage, PlayerPage, DisplayPage, YoutubePlayerService e MediaSessionService.
- Risolto il disallineamento per cui la parrocchia 123456 mostrava 196 brani anziché 208.
This commit is contained in:
David Frassi
2026-05-20 12:11:05 +02:00
parent d83a5db65a
commit 19993a0051
7 changed files with 54 additions and 3 deletions
+24
View File
@@ -1,6 +1,7 @@
import { Injectable, signal, inject, effect } from '@angular/core';
import { HttpClient, HttpRequest, HttpEventType, HttpResponse } from '@angular/common/http';
import { SettingsService } from './settings.service';
import { Canto } from './canti.service';
export interface ParrocchiaItem {
id_parrocchia: number;
@@ -41,6 +42,7 @@ export class ComunitaService {
public comunitaCantiIds = signal<(number | string)[]>([]);
public comunitaCantiInfo = signal<ParrocchiaCantiItem[]>([]);
public comunitaCantiSettings = signal<CantiSettingsItem[]>([]);
public comunitaCantiPersonali = signal<Canto[]>([]);
public isFilterActive = signal<boolean>(false);
public loading = signal<boolean>(false);
public loadingProgress = signal<number>(0);
@@ -52,6 +54,7 @@ export class ComunitaService {
const savedCanti = localStorage.getItem('comunita-canti-ids');
const savedInfo = localStorage.getItem('comunita-canti-info');
const savedSettings = localStorage.getItem('comunita-canti-settings');
const savedCantiPersonali = localStorage.getItem('comunita-canti-personali');
const savedFilterActive = localStorage.getItem('comunita-filter-active') === 'true';
if (savedCode) this.comunitaCode.set(savedCode);
@@ -66,6 +69,9 @@ export class ComunitaService {
if (savedSettings) {
try { this.comunitaCantiSettings.set(JSON.parse(savedSettings)); } catch (e) {}
}
if (savedCantiPersonali) {
try { this.comunitaCantiPersonali.set(JSON.parse(savedCantiPersonali)); } catch (e) {}
}
this.isFilterActive.set(savedFilterActive);
effect(() => {
@@ -75,6 +81,7 @@ export class ComunitaService {
localStorage.setItem('comunita-canti-ids', JSON.stringify(this.comunitaCantiIds()));
localStorage.setItem('comunita-canti-info', JSON.stringify(this.comunitaCantiInfo()));
localStorage.setItem('comunita-canti-settings', JSON.stringify(this.comunitaCantiSettings()));
localStorage.setItem('comunita-canti-personali', JSON.stringify(this.comunitaCantiPersonali()));
localStorage.setItem('comunita-filter-active', this.isFilterActive().toString());
});
@@ -122,6 +129,7 @@ export class ComunitaService {
this.comunitaCantiIds.set([]);
this.comunitaCantiInfo.set([]);
this.comunitaCantiSettings.set([]);
this.comunitaCantiPersonali.set([]);
this.isFilterActive.set(false);
return true;
}
@@ -139,12 +147,27 @@ export class ComunitaService {
const cantiList = data.parrocchia_canti?.data || [];
const settingsList = data.canti_settings?.data || [];
// Parse canti_personali (custom unvalidated community canti)
const cantiPersonaliList = (data as any).canti_personali?.data || [];
const mappedCantiPersonali = cantiPersonaliList.map((cp: any) => ({
id: cp.id_canti.toString(),
id_canti: cp.id_canti,
titolo: cp.titolo,
testo: cp.accordi || '',
accordi: cp.accordi || '',
autore: cp.autore || '',
link_youtube: cp.link_youtube || '',
id_momenti: [],
data_update: cp.data_update || ''
}));
this.comunitaCode.set(trimmedCode);
this.comunitaNome.set(parrocchia.nome || `Comunità ${trimmedCode}`);
this.comunitaMail.set(parrocchia.mail || '');
this.comunitaCantiInfo.set(cantiList);
this.comunitaCantiIds.set(cantiList.map(c => c.id_canti));
this.comunitaCantiSettings.set(settingsList);
this.comunitaCantiPersonali.set(mappedCantiPersonali);
this.isFilterActive.set(true);
this.loading.set(false);
return true;
@@ -180,6 +203,7 @@ export class ComunitaService {
this.comunitaCantiInfo.set(mockInfo);
this.comunitaCantiSettings.set([]);
this.comunitaCantiPersonali.set([]);
this.isFilterActive.set(true);
this.loading.set(false);
return true;