✨ Infinite playing
💄 Optimized UX
This commit is contained in:
@@ -36,6 +36,7 @@ class SettingsState {
|
||||
final bool watchForChanges;
|
||||
final DefaultPlayerScreen defaultPlayerScreen;
|
||||
final LyricsMode lyricsMode;
|
||||
final bool continuePlays;
|
||||
final Set<String> supportedFormats;
|
||||
|
||||
const SettingsState({
|
||||
@@ -44,6 +45,7 @@ class SettingsState {
|
||||
this.watchForChanges = true,
|
||||
this.defaultPlayerScreen = DefaultPlayerScreen.cover,
|
||||
this.lyricsMode = LyricsMode.auto,
|
||||
this.continuePlays = false,
|
||||
this.supportedFormats = const {
|
||||
'.mp3',
|
||||
'.flac',
|
||||
@@ -62,6 +64,7 @@ class SettingsState {
|
||||
bool? watchForChanges,
|
||||
DefaultPlayerScreen? defaultPlayerScreen,
|
||||
LyricsMode? lyricsMode,
|
||||
bool? continuePlays,
|
||||
Set<String>? supportedFormats,
|
||||
}) {
|
||||
return SettingsState(
|
||||
@@ -70,6 +73,7 @@ class SettingsState {
|
||||
watchForChanges: watchForChanges ?? this.watchForChanges,
|
||||
defaultPlayerScreen: defaultPlayerScreen ?? this.defaultPlayerScreen,
|
||||
lyricsMode: lyricsMode ?? this.lyricsMode,
|
||||
continuePlays: continuePlays ?? this.continuePlays,
|
||||
supportedFormats: supportedFormats ?? this.supportedFormats,
|
||||
);
|
||||
}
|
||||
@@ -82,6 +86,7 @@ class SettingsNotifier extends _$SettingsNotifier {
|
||||
static const String _watchForChangesKey = 'watch_for_changes';
|
||||
static const String _defaultPlayerScreenKey = 'default_player_screen';
|
||||
static const String _lyricsModeKey = 'lyrics_mode';
|
||||
static const String _continuePlaysKey = 'continue_plays';
|
||||
|
||||
@override
|
||||
Future<SettingsState> build() async {
|
||||
@@ -101,12 +106,15 @@ class SettingsNotifier extends _$SettingsNotifier {
|
||||
prefs.getInt(_lyricsModeKey) ?? 2; // Auto is default
|
||||
final lyricsMode = LyricsMode.values[lyricsModeIndex];
|
||||
|
||||
final continuePlays = prefs.getBool(_continuePlaysKey) ?? false;
|
||||
|
||||
return SettingsState(
|
||||
importMode: importMode,
|
||||
autoScan: autoScan,
|
||||
watchForChanges: watchForChanges,
|
||||
defaultPlayerScreen: defaultPlayerScreen,
|
||||
lyricsMode: lyricsMode,
|
||||
continuePlays: continuePlays,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -156,6 +164,15 @@ class SettingsNotifier extends _$SettingsNotifier {
|
||||
state = AsyncValue.data(state.value!.copyWith(lyricsMode: mode));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> setContinuePlays(bool enabled) async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setBool(_continuePlaysKey, enabled);
|
||||
|
||||
if (state.hasValue) {
|
||||
state = AsyncValue.data(state.value!.copyWith(continuePlays: enabled));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Convenience providers for specific settings
|
||||
@@ -248,3 +265,21 @@ class LyricsModeNotifier extends _$LyricsModeNotifier {
|
||||
await ref.read(settingsProvider.notifier).setLyricsMode(mode);
|
||||
}
|
||||
}
|
||||
|
||||
@riverpod
|
||||
class ContinuePlaysNotifier extends _$ContinuePlaysNotifier {
|
||||
@override
|
||||
bool build() {
|
||||
return ref
|
||||
.watch(settingsProvider)
|
||||
.when(
|
||||
data: (settings) => settings.continuePlays,
|
||||
loading: () => false,
|
||||
error: (_, _) => false,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> update(bool enabled) async {
|
||||
await ref.read(settingsProvider.notifier).setContinuePlays(enabled);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ final class SettingsNotifierProvider
|
||||
SettingsNotifier create() => SettingsNotifier();
|
||||
}
|
||||
|
||||
String _$settingsNotifierHash() => r'4099dd1aa3dfc971c0761f314d196f3bc97315e7';
|
||||
String _$settingsNotifierHash() => r'7c3a92d9ac94e175b79a3a4485bd9bbcc1e860f9';
|
||||
|
||||
abstract class _$SettingsNotifier extends $AsyncNotifier<SettingsState> {
|
||||
FutureOr<SettingsState> build();
|
||||
@@ -324,3 +324,57 @@ abstract class _$LyricsModeNotifier extends $Notifier<LyricsMode> {
|
||||
element.handleValue(ref, created);
|
||||
}
|
||||
}
|
||||
|
||||
@ProviderFor(ContinuePlaysNotifier)
|
||||
const continuePlaysProvider = ContinuePlaysNotifierProvider._();
|
||||
|
||||
final class ContinuePlaysNotifierProvider
|
||||
extends $NotifierProvider<ContinuePlaysNotifier, bool> {
|
||||
const ContinuePlaysNotifierProvider._()
|
||||
: super(
|
||||
from: null,
|
||||
argument: null,
|
||||
retry: null,
|
||||
name: r'continuePlaysProvider',
|
||||
isAutoDispose: true,
|
||||
dependencies: null,
|
||||
$allTransitiveDependencies: null,
|
||||
);
|
||||
|
||||
@override
|
||||
String debugGetCreateSourceHash() => _$continuePlaysNotifierHash();
|
||||
|
||||
@$internal
|
||||
@override
|
||||
ContinuePlaysNotifier create() => ContinuePlaysNotifier();
|
||||
|
||||
/// {@macro riverpod.override_with_value}
|
||||
Override overrideWithValue(bool value) {
|
||||
return $ProviderOverride(
|
||||
origin: this,
|
||||
providerOverride: $SyncValueProvider<bool>(value),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
String _$continuePlaysNotifierHash() =>
|
||||
r'17e5f9c933d67837301775ac5beda25462130775';
|
||||
|
||||
abstract class _$ContinuePlaysNotifier extends $Notifier<bool> {
|
||||
bool build();
|
||||
@$mustCallSuper
|
||||
@override
|
||||
void runBuild() {
|
||||
final created = build();
|
||||
final ref = this.ref as $Ref<bool, bool>;
|
||||
final element =
|
||||
ref.element
|
||||
as $ClassProviderElement<
|
||||
AnyNotifier<bool, bool>,
|
||||
bool,
|
||||
Object?,
|
||||
Object?
|
||||
>;
|
||||
element.handleValue(ref, created);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user