mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 16:05:18 +00:00
fixed Spotube doesn't remember theme setting (#54)
This commit is contained in:
parent
d62f3ce6a1
commit
46efefe07c
@ -11,7 +11,6 @@ import 'package:spotube/components/Shared/PageWindowTitleBar.dart';
|
|||||||
import 'package:spotube/models/LocalStorageKeys.dart';
|
import 'package:spotube/models/LocalStorageKeys.dart';
|
||||||
import 'package:spotube/models/SpotifyMarkets.dart';
|
import 'package:spotube/models/SpotifyMarkets.dart';
|
||||||
import 'package:spotube/provider/Auth.dart';
|
import 'package:spotube/provider/Auth.dart';
|
||||||
import 'package:spotube/provider/ThemeProvider.dart';
|
|
||||||
import 'package:spotube/provider/UserPreferences.dart';
|
import 'package:spotube/provider/UserPreferences.dart';
|
||||||
|
|
||||||
class Settings extends HookConsumerWidget {
|
class Settings extends HookConsumerWidget {
|
||||||
@ -20,7 +19,6 @@ class Settings extends HookConsumerWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, ref) {
|
Widget build(BuildContext context, ref) {
|
||||||
final UserPreferences preferences = ref.watch(userPreferencesProvider);
|
final UserPreferences preferences = ref.watch(userPreferencesProvider);
|
||||||
final ThemeMode theme = ref.watch(themeProvider);
|
|
||||||
final Auth auth = ref.watch(authProvider);
|
final Auth auth = ref.watch(authProvider);
|
||||||
var geniusAccessToken = useState<String?>(null);
|
var geniusAccessToken = useState<String?>(null);
|
||||||
TextEditingController textEditingController = useTextEditingController();
|
TextEditingController textEditingController = useTextEditingController();
|
||||||
@ -115,7 +113,7 @@ class Settings extends HookConsumerWidget {
|
|||||||
children: [
|
children: [
|
||||||
const Text("Theme"),
|
const Text("Theme"),
|
||||||
DropdownButton<ThemeMode>(
|
DropdownButton<ThemeMode>(
|
||||||
value: theme,
|
value: preferences.themeMode,
|
||||||
items: const [
|
items: const [
|
||||||
DropdownMenuItem(
|
DropdownMenuItem(
|
||||||
child: Text(
|
child: Text(
|
||||||
@ -136,7 +134,7 @@ class Settings extends HookConsumerWidget {
|
|||||||
],
|
],
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
ref.read(themeProvider.notifier).state = value;
|
preferences.setThemeMode(value);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -6,12 +6,10 @@ import 'package:flutter_hooks/flutter_hooks.dart';
|
|||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:hotkey_manager/hotkey_manager.dart';
|
import 'package:hotkey_manager/hotkey_manager.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
|
||||||
import 'package:spotube/models/GoRouteDeclarations.dart';
|
import 'package:spotube/models/GoRouteDeclarations.dart';
|
||||||
import 'package:spotube/models/LocalStorageKeys.dart';
|
|
||||||
import 'package:spotube/models/Logger.dart';
|
import 'package:spotube/models/Logger.dart';
|
||||||
import 'package:spotube/provider/AudioPlayer.dart';
|
import 'package:spotube/provider/AudioPlayer.dart';
|
||||||
import 'package:spotube/provider/ThemeProvider.dart';
|
import 'package:spotube/provider/UserPreferences.dart';
|
||||||
import 'package:spotube/provider/YouTube.dart';
|
import 'package:spotube/provider/YouTube.dart';
|
||||||
import 'package:just_audio_background/just_audio_background.dart';
|
import 'package:just_audio_background/just_audio_background.dart';
|
||||||
|
|
||||||
@ -44,25 +42,11 @@ class MyApp extends HookConsumerWidget {
|
|||||||
MyApp({Key? key}) : super(key: key);
|
MyApp({Key? key}) : super(key: key);
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, ref) {
|
Widget build(BuildContext context, ref) {
|
||||||
var themeMode = ref.watch(themeProvider);
|
var themeMode =
|
||||||
|
ref.watch(userPreferencesProvider.select((s) => s.themeMode));
|
||||||
var player = ref.watch(audioPlayerProvider);
|
var player = ref.watch(audioPlayerProvider);
|
||||||
var youtube = ref.watch(youtubeProvider);
|
var youtube = ref.watch(youtubeProvider);
|
||||||
useEffect(() {
|
useEffect(() {
|
||||||
SharedPreferences.getInstance().then((localStorage) {
|
|
||||||
String? themeMode = localStorage.getString(LocalStorageKeys.themeMode);
|
|
||||||
var themeNotifier = ref.read(themeProvider.notifier);
|
|
||||||
|
|
||||||
switch (themeMode) {
|
|
||||||
case "light":
|
|
||||||
themeNotifier.state = ThemeMode.light;
|
|
||||||
break;
|
|
||||||
case "dark":
|
|
||||||
themeNotifier.state = ThemeMode.dark;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
themeNotifier.state = ThemeMode.system;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return () {
|
return () {
|
||||||
player.dispose();
|
player.dispose();
|
||||||
youtube.close();
|
youtube.close();
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
||||||
|
|
||||||
var themeProvider = StateProvider<ThemeMode>((ref) {
|
|
||||||
return ThemeMode.system;
|
|
||||||
});
|
|
@ -1,6 +1,6 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:hotkey_manager/hotkey_manager.dart';
|
import 'package:hotkey_manager/hotkey_manager.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
@ -10,15 +10,18 @@ import 'package:spotube/models/Logger.dart';
|
|||||||
import 'package:spotube/models/generated_secrets.dart';
|
import 'package:spotube/models/generated_secrets.dart';
|
||||||
|
|
||||||
class UserPreferences extends ChangeNotifier {
|
class UserPreferences extends ChangeNotifier {
|
||||||
|
ThemeMode themeMode;
|
||||||
String recommendationMarket;
|
String recommendationMarket;
|
||||||
bool saveTrackLyrics;
|
bool saveTrackLyrics;
|
||||||
String geniusAccessToken;
|
String geniusAccessToken;
|
||||||
|
SharedPreferences? localStorage;
|
||||||
HotKey? nextTrackHotKey;
|
HotKey? nextTrackHotKey;
|
||||||
HotKey? prevTrackHotKey;
|
HotKey? prevTrackHotKey;
|
||||||
HotKey? playPauseHotKey;
|
HotKey? playPauseHotKey;
|
||||||
UserPreferences({
|
UserPreferences({
|
||||||
required this.geniusAccessToken,
|
required this.geniusAccessToken,
|
||||||
required this.recommendationMarket,
|
required this.recommendationMarket,
|
||||||
|
required this.themeMode,
|
||||||
this.saveTrackLyrics = false,
|
this.saveTrackLyrics = false,
|
||||||
this.nextTrackHotKey,
|
this.nextTrackHotKey,
|
||||||
this.prevTrackHotKey,
|
this.prevTrackHotKey,
|
||||||
@ -29,9 +32,8 @@ class UserPreferences extends ChangeNotifier {
|
|||||||
|
|
||||||
final logger = getLogger(UserPreferences);
|
final logger = getLogger(UserPreferences);
|
||||||
|
|
||||||
Future<HotKey?> _getHotKeyFromLocalStorage(
|
Future<HotKey?> _getHotKeyFromLocalStorage(String key) async {
|
||||||
SharedPreferences preferences, String key) async {
|
String? str = localStorage?.getString(key);
|
||||||
String? str = preferences.getString(key);
|
|
||||||
if (str != null) {
|
if (str != null) {
|
||||||
Map<String, dynamic> json = await jsonDecode(str);
|
Map<String, dynamic> json = await jsonDecode(str);
|
||||||
if (json.isEmpty) {
|
if (json.isEmpty) {
|
||||||
@ -44,21 +46,33 @@ class UserPreferences extends ChangeNotifier {
|
|||||||
|
|
||||||
Future<void> onInit() async {
|
Future<void> onInit() async {
|
||||||
try {
|
try {
|
||||||
SharedPreferences localStorage = await SharedPreferences.getInstance();
|
localStorage = await SharedPreferences.getInstance();
|
||||||
String? accessToken =
|
String? accessToken =
|
||||||
localStorage.getString(LocalStorageKeys.geniusAccessToken);
|
localStorage?.getString(LocalStorageKeys.geniusAccessToken);
|
||||||
|
|
||||||
saveTrackLyrics =
|
saveTrackLyrics =
|
||||||
localStorage.getBool(LocalStorageKeys.saveTrackLyrics) ?? false;
|
localStorage?.getBool(LocalStorageKeys.saveTrackLyrics) ?? false;
|
||||||
|
|
||||||
|
final themeModeRaw = localStorage?.getString(LocalStorageKeys.themeMode);
|
||||||
|
switch (themeModeRaw) {
|
||||||
|
case "light":
|
||||||
|
themeMode = ThemeMode.light;
|
||||||
|
break;
|
||||||
|
case "dark":
|
||||||
|
themeMode = ThemeMode.dark;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
themeMode = ThemeMode.system;
|
||||||
|
}
|
||||||
|
|
||||||
recommendationMarket =
|
recommendationMarket =
|
||||||
localStorage.getString(LocalStorageKeys.recommendationMarket) ?? 'US';
|
localStorage?.getString(LocalStorageKeys.recommendationMarket) ??
|
||||||
|
'US';
|
||||||
geniusAccessToken = accessToken != null && accessToken.isNotEmpty
|
geniusAccessToken = accessToken != null && accessToken.isNotEmpty
|
||||||
? accessToken
|
? accessToken
|
||||||
: getRandomElement(lyricsSecrets);
|
: getRandomElement(lyricsSecrets);
|
||||||
|
|
||||||
nextTrackHotKey ??= (await _getHotKeyFromLocalStorage(
|
nextTrackHotKey ??= (await _getHotKeyFromLocalStorage(
|
||||||
localStorage,
|
|
||||||
LocalStorageKeys.nextTrackHotKey,
|
LocalStorageKeys.nextTrackHotKey,
|
||||||
)) ??
|
)) ??
|
||||||
HotKey(
|
HotKey(
|
||||||
@ -67,7 +81,6 @@ class UserPreferences extends ChangeNotifier {
|
|||||||
);
|
);
|
||||||
|
|
||||||
prevTrackHotKey ??= (await _getHotKeyFromLocalStorage(
|
prevTrackHotKey ??= (await _getHotKeyFromLocalStorage(
|
||||||
localStorage,
|
|
||||||
LocalStorageKeys.prevTrackHotKey,
|
LocalStorageKeys.prevTrackHotKey,
|
||||||
)) ??
|
)) ??
|
||||||
HotKey(
|
HotKey(
|
||||||
@ -76,7 +89,6 @@ class UserPreferences extends ChangeNotifier {
|
|||||||
);
|
);
|
||||||
|
|
||||||
playPauseHotKey ??= (await _getHotKeyFromLocalStorage(
|
playPauseHotKey ??= (await _getHotKeyFromLocalStorage(
|
||||||
localStorage,
|
|
||||||
LocalStorageKeys.playPauseHotKey,
|
LocalStorageKeys.playPauseHotKey,
|
||||||
)) ??
|
)) ??
|
||||||
HotKey(
|
HotKey(
|
||||||
@ -89,20 +101,21 @@ class UserPreferences extends ChangeNotifier {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setThemeMode(ThemeMode mode) {
|
||||||
|
themeMode = mode;
|
||||||
|
localStorage?.setString(LocalStorageKeys.themeMode, mode.name);
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
void setSaveTrackLyrics(bool shouldSave) {
|
void setSaveTrackLyrics(bool shouldSave) {
|
||||||
saveTrackLyrics = shouldSave;
|
saveTrackLyrics = shouldSave;
|
||||||
SharedPreferences.getInstance().then((value) {
|
localStorage?.setBool(LocalStorageKeys.saveTrackLyrics, shouldSave);
|
||||||
value.setBool(LocalStorageKeys.saveTrackLyrics, shouldSave);
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setRecommendationMarket(String country) {
|
void setRecommendationMarket(String country) {
|
||||||
recommendationMarket = country;
|
recommendationMarket = country;
|
||||||
SharedPreferences.getInstance().then((value) {
|
localStorage?.setString(LocalStorageKeys.recommendationMarket, country);
|
||||||
value.setString(LocalStorageKeys.recommendationMarket, country);
|
|
||||||
notifyListeners();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setGeniusAccessToken(String token) {
|
void setGeniusAccessToken(String token) {
|
||||||
@ -112,38 +125,36 @@ class UserPreferences extends ChangeNotifier {
|
|||||||
|
|
||||||
void setNextTrackHotKey(HotKey? value) {
|
void setNextTrackHotKey(HotKey? value) {
|
||||||
nextTrackHotKey = value;
|
nextTrackHotKey = value;
|
||||||
SharedPreferences.getInstance().then((preferences) {
|
localStorage?.setString(
|
||||||
preferences.setString(
|
|
||||||
LocalStorageKeys.nextTrackHotKey,
|
LocalStorageKeys.nextTrackHotKey,
|
||||||
jsonEncode(value?.toJson() ?? {}),
|
jsonEncode(value?.toJson() ?? {}),
|
||||||
);
|
);
|
||||||
});
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
void setPrevTrackHotKey(HotKey? value) {
|
void setPrevTrackHotKey(HotKey? value) {
|
||||||
prevTrackHotKey = value;
|
prevTrackHotKey = value;
|
||||||
SharedPreferences.getInstance().then((preferences) {
|
localStorage?.setString(
|
||||||
preferences.setString(
|
|
||||||
LocalStorageKeys.prevTrackHotKey,
|
LocalStorageKeys.prevTrackHotKey,
|
||||||
jsonEncode(value?.toJson() ?? {}),
|
jsonEncode(value?.toJson() ?? {}),
|
||||||
);
|
);
|
||||||
});
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
void setPlayPauseHotKey(HotKey? value) {
|
void setPlayPauseHotKey(HotKey? value) {
|
||||||
playPauseHotKey = value;
|
playPauseHotKey = value;
|
||||||
SharedPreferences.getInstance().then((preferences) {
|
localStorage?.setString(
|
||||||
preferences.setString(
|
|
||||||
LocalStorageKeys.playPauseHotKey,
|
LocalStorageKeys.playPauseHotKey,
|
||||||
jsonEncode(value?.toJson() ?? {}),
|
jsonEncode(value?.toJson() ?? {}),
|
||||||
);
|
);
|
||||||
});
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final userPreferencesProvider = ChangeNotifierProvider(
|
final userPreferencesProvider = ChangeNotifierProvider(
|
||||||
(_) => UserPreferences(geniusAccessToken: "", recommendationMarket: 'US'),
|
(_) => UserPreferences(
|
||||||
|
geniusAccessToken: "",
|
||||||
|
recommendationMarket: 'US',
|
||||||
|
themeMode: ThemeMode.system,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user