Architettura Webapp
La webapp di TuneCamp è una moderna Single Page Application (SPA) costruita con React e Vite, ottimizzata per l'esperienza d'uso musicale e l'interazione decentralizzata.
Stack Tecnologico
- Framework UI: React (TypeScript)
- Strumento di Build: Vite
- Gestione dello Stato: Zustand
- Routing: React Router
- Instance Discovery: API REST Gossip su HTTP
- Wallet: Ethers.js v6 (injected provider EIP-1193, es. MetaMask)
Organizzazione del Codice
1. Componenti (components/)
Organizzati per dominio funzionale:
player/: Il riproduttore musicale globale, gestisce lo stato di riproduzione, la coda e la visualizzazione della forma d'onda.artist/,auth/,admin/: Componenti specifici per le diverse aree dell'applicazione.ui/: Componenti atomici e riutilizzabili (pulsanti, input, indicatori di caricamento).
2. Pagine (pages/)
Ogni file rappresenta una rotta principale:
Home.tsx: Dashboard principale.Albums.tsx/Artists.tsx: Navigazione della libreria.Admin.tsx: Pannello di gestione per l'amministratore del server.Network.tsx: Visualizzazione della rete federata.
3. State Store (stores/)
Utilizziamo Zustand per una gestione dello stato leggera e ad alte prestazioni:
usePlayerStore: Stato di riproduzione corrente (coda di riproduzione, traccia attiva).useAuthStore: Stato dell'utente connesso e token JWT.useWalletStore: Stato del wallet connesso (account, rete).useConfigStore: Configurazione dell'istanza (branding, feature flag).useUIStore: Stato dell'interfaccia (finestre modali, pannelli).useDigStore: Stato della modalità "Dig" (scoperta musicale / crate digging).
4. Servizi (services/)
api.ts: Wrapper per le chiamate REST al backend di TuneCamp.wallet.ts: Gestione del wallet nel browser (connessione, firma dei messaggi, transazioni on-chain tramite ethers).
Flusso di Navigazione e Riproduzione
- Navigazione: L'utente clicca su un album ->
AlbumDetails.tsxrichiede i dati tramiteapi.ts-> I dati vengono visualizzati utilizzando i componenti incomponents/artist/. - Riproduzione: Clic su "Riproduci" -> La traccia viene aggiunta a
usePlayerStore-> Il componenteplayer/avvia lo streaming dal backend (/api/tracks/:id/stream), con fallback ai provider esterni se il file locale non è presente. - Interazione Web3: Connessione del wallet ->
wallet.tsgestisce l'account -> Possibilità di acquistare pubblicazioni o sbloccare contenuti.