import 'dart:typed_data'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:just_audio/just_audio.dart'; import '../../../../core/supabase/supabase_providers.dart'; import '../../data/services/music_service.dart'; import '../../domain/models/track_model.dart'; final musicServiceProvider = Provider((ref) { final client = ref.watch(supabaseProvider); return MusicService(client); }); final trackListProvider = FutureProvider>((ref) { return ref.watch(musicServiceProvider).fetchTracks(); }); final userTracksProvider = FutureProvider.family, String>((ref, userId) { return ref.watch(musicServiceProvider).fetchUserTracks(userId); }); final musicControllerProvider = AutoDisposeAsyncNotifierProvider( MusicController.new, ); class MusicController extends AutoDisposeAsyncNotifier { @override Future build() async {} Future uploadTrack({ required Uint8List bytes, required String title, required String genreTag, required String extension, }) async { state = const AsyncLoading(); state = await AsyncValue.guard(() async { await ref.read(musicServiceProvider).uploadTrack( bytes: bytes, title: title, genreTag: genreTag, extension: extension, ); ref.invalidate(trackListProvider); }); } Future incrementPlays(String trackId) async { await AsyncValue.guard(() => ref.read(musicServiceProvider).incrementPlays(trackId)); } } final audioPlayerProvider = Provider.autoDispose((ref) { final player = AudioPlayer(); ref.onDispose(player.dispose); return player; }); final currentTrackProvider = StateProvider((ref) => null); final isPlayingProvider = StreamProvider((ref) { final player = ref.watch(audioPlayerProvider); return player.playingStream; });