63 lines
1.9 KiB
Dart
63 lines
1.9 KiB
Dart
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<MusicService>((ref) {
|
|
final client = ref.watch(supabaseProvider);
|
|
return MusicService(client);
|
|
});
|
|
|
|
final trackListProvider = FutureProvider<List<TrackModel>>((ref) {
|
|
return ref.watch(musicServiceProvider).fetchTracks();
|
|
});
|
|
|
|
final userTracksProvider = FutureProvider.family<List<TrackModel>, String>((ref, userId) {
|
|
return ref.watch(musicServiceProvider).fetchUserTracks(userId);
|
|
});
|
|
|
|
final musicControllerProvider = AutoDisposeAsyncNotifierProvider<MusicController, void>(
|
|
MusicController.new,
|
|
);
|
|
|
|
class MusicController extends AutoDisposeAsyncNotifier<void> {
|
|
@override
|
|
Future<void> build() async {}
|
|
|
|
Future<void> 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<void> incrementPlays(String trackId) async {
|
|
await AsyncValue.guard(() => ref.read(musicServiceProvider).incrementPlays(trackId));
|
|
}
|
|
}
|
|
|
|
final audioPlayerProvider = Provider.autoDispose<AudioPlayer>((ref) {
|
|
final player = AudioPlayer();
|
|
ref.onDispose(player.dispose);
|
|
return player;
|
|
});
|
|
|
|
final currentTrackProvider = StateProvider<TrackModel?>((ref) => null);
|
|
final isPlayingProvider = StreamProvider<bool>((ref) {
|
|
final player = ref.watch(audioPlayerProvider);
|
|
return player.playingStream;
|
|
});
|