show snackbar error for sync

log http errors
log sync errors
This commit is contained in:
austinried 2023-05-15 06:39:20 +09:00
parent 67f0c926c4
commit c2733482e5
4 changed files with 60 additions and 36 deletions

View File

@ -4,6 +4,7 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import '../services/sync_service.dart'; import '../services/sync_service.dart';
import 'items.dart'; import 'items.dart';
import 'snackbars.dart';
class PagedListQueryView<T> extends HookConsumerWidget { class PagedListQueryView<T> extends HookConsumerWidget {
final PagingController<int, T> pagingController; final PagingController<int, T> pagingController;
@ -122,7 +123,13 @@ class SyncAllRefresh extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
return RefreshIndicator( return RefreshIndicator(
onRefresh: () => ref.read(syncServiceProvider.notifier).syncAll(), onRefresh: () async {
try {
await ref.read(syncServiceProvider.notifier).syncAll();
} catch (e) {
showErrorSnackbar(context, e.toString());
}
},
child: child, child: child,
); );
} }

View File

@ -16,7 +16,14 @@ class SubtracksHttpClient extends BaseClient {
Future<StreamedResponse> send(BaseRequest request) { Future<StreamedResponse> send(BaseRequest request) {
request.headers.addAll(subtracksHeaders); request.headers.addAll(subtracksHeaders);
log.info('${request.method} ${_redactUri(request.url)}'); log.info('${request.method} ${_redactUri(request.url)}');
return request.send();
try {
return request.send();
} catch (e, st) {
log.severe(
'HTTP client: ${request.method} ${_redactUri(request.url)}', e, st);
rethrow;
}
} }
} }

View File

@ -95,36 +95,36 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
int get _sourceId => _ref.read(sourceIdProvider); int get _sourceId => _ref.read(sourceIdProvider);
AudioControl(this._player, this._ref) { AudioControl(this._player, this._ref) {
_player.playbackEventStream.listen( _player.playbackEventStream.listen((PlaybackEvent event) {
(PlaybackEvent event) { final playing = _player.playing;
final playing = _player.playing; playbackState.add(playbackState.value.copyWith(
playbackState.add(playbackState.value.copyWith( controls: [
controls: [ MediaControl.skipToPrevious,
MediaControl.skipToPrevious, if (playing) MediaControl.pause else MediaControl.play,
if (playing) MediaControl.pause else MediaControl.play, MediaControl.stop,
MediaControl.stop, MediaControl.skipToNext,
MediaControl.skipToNext, ],
], systemActions: const {
systemActions: const { MediaAction.seek,
MediaAction.seek, },
}, androidCompactActionIndices: const [0, 1, 3],
androidCompactActionIndices: const [0, 1, 3], processingState: const {
processingState: const { ProcessingState.idle: AudioProcessingState.idle,
ProcessingState.idle: AudioProcessingState.idle, ProcessingState.loading: AudioProcessingState.loading,
ProcessingState.loading: AudioProcessingState.loading, ProcessingState.buffering: AudioProcessingState.buffering,
ProcessingState.buffering: AudioProcessingState.buffering, ProcessingState.ready: AudioProcessingState.ready,
ProcessingState.ready: AudioProcessingState.ready, ProcessingState.completed: AudioProcessingState.completed,
ProcessingState.completed: AudioProcessingState.completed, }[_player.processingState]!,
}[_player.processingState]!, playing: playing,
playing: playing, updatePosition: _player.position,
updatePosition: _player.position, bufferedPosition: _player.bufferedPosition,
bufferedPosition: _player.bufferedPosition, queueIndex: event.currentIndex,
queueIndex: event.currentIndex, ));
)); });
},
onError: (e, st) => log.warning('Audio playback error', e, st), _player.playbackEventStream.doOnError((e, st) async {
cancelOnError: false, log.warning('playbackEventStream', e, st);
); });
shuffleIndicies.listen((value) { shuffleIndicies.listen((value) {
playbackState.add(playbackState.value.copyWith( playbackState.add(playbackState.value.copyWith(

View File

@ -1,6 +1,8 @@
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:rxdart/rxdart.dart';
import '../database/database.dart'; import '../database/database.dart';
import '../log.dart';
import '../state/settings.dart'; import '../state/settings.dart';
abstract class BaseMusicSource { abstract class BaseMusicSource {
@ -40,25 +42,33 @@ class MusicSource implements BaseMusicSource {
@override @override
Stream<Iterable<AlbumsCompanion>> allAlbums() { Stream<Iterable<AlbumsCompanion>> allAlbums() {
_testOnline(); _testOnline();
return _source.allAlbums(); return _source
.allAlbums()
.doOnError((e, st) => log.severe('allAlbums', e, st));
} }
@override @override
Stream<Iterable<ArtistsCompanion>> allArtists() { Stream<Iterable<ArtistsCompanion>> allArtists() {
_testOnline(); _testOnline();
return _source.allArtists(); return _source
.allArtists()
.doOnError((e, st) => log.severe('allArtists', e, st));
} }
@override @override
Stream<Iterable<PlaylistWithSongsCompanion>> allPlaylists() { Stream<Iterable<PlaylistWithSongsCompanion>> allPlaylists() {
_testOnline(); _testOnline();
return _source.allPlaylists(); return _source
.allPlaylists()
.doOnError((e, st) => log.severe('allPlaylists', e, st));
} }
@override @override
Stream<Iterable<SongsCompanion>> allSongs() { Stream<Iterable<SongsCompanion>> allSongs() {
_testOnline(); _testOnline();
return _source.allSongs(); return _source
.allSongs()
.doOnError((e, st) => log.severe('allSongs', e, st));
} }
@override @override