mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
Update Checker implemented
private playlists of current user aren't shown fix (https://github.com/KRTirtho/spotube/issues/92)
This commit is contained in:
parent
9224b4c316
commit
46d9b656f9
@ -19,12 +19,14 @@ import 'package:spotube/components/Library/UserLibrary.dart';
|
|||||||
import 'package:spotube/hooks/useBreakpointValue.dart';
|
import 'package:spotube/hooks/useBreakpointValue.dart';
|
||||||
import 'package:spotube/hooks/useHotKeys.dart';
|
import 'package:spotube/hooks/useHotKeys.dart';
|
||||||
import 'package:spotube/hooks/usePaginatedFutureProvider.dart';
|
import 'package:spotube/hooks/usePaginatedFutureProvider.dart';
|
||||||
|
import 'package:spotube/hooks/useUpdateChecker.dart';
|
||||||
import 'package:spotube/models/Logger.dart';
|
import 'package:spotube/models/Logger.dart';
|
||||||
import 'package:spotube/provider/SpotifyRequests.dart';
|
import 'package:spotube/provider/SpotifyRequests.dart';
|
||||||
|
|
||||||
List<String> spotifyScopes = [
|
List<String> spotifyScopes = [
|
||||||
"playlist-modify-public",
|
"playlist-modify-public",
|
||||||
"playlist-modify-private",
|
"playlist-modify-private",
|
||||||
|
"playlist-read-private",
|
||||||
"user-library-read",
|
"user-library-read",
|
||||||
"user-library-modify",
|
"user-library-modify",
|
||||||
"user-read-private",
|
"user-read-private",
|
||||||
@ -52,6 +54,8 @@ class Home extends HookConsumerWidget {
|
|||||||
|
|
||||||
// initializing global hot keys
|
// initializing global hot keys
|
||||||
useHotKeys(ref);
|
useHotKeys(ref);
|
||||||
|
// checks for latest version of the application
|
||||||
|
useUpdateChecker(ref);
|
||||||
|
|
||||||
final titleBarContents = Container(
|
final titleBarContents = Container(
|
||||||
color: Theme.of(context).scaffoldBackgroundColor,
|
color: Theme.of(context).scaffoldBackgroundColor,
|
||||||
|
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:spotube/provider/SpotifyDI.dart';
|
import 'package:spotube/provider/SpotifyDI.dart';
|
||||||
|
import 'package:spotube/provider/SpotifyRequests.dart';
|
||||||
|
|
||||||
class PlaylistCreateDialog extends HookConsumerWidget {
|
class PlaylistCreateDialog extends HookConsumerWidget {
|
||||||
const PlaylistCreateDialog({Key? key}) : super(key: key);
|
const PlaylistCreateDialog({Key? key}) : super(key: key);
|
||||||
@ -49,7 +50,10 @@ class PlaylistCreateDialog extends HookConsumerWidget {
|
|||||||
public: public.value,
|
public: public.value,
|
||||||
description: description.text,
|
description: description.text,
|
||||||
)
|
)
|
||||||
.then((_) => Navigator.pop(context));
|
.then((_) {
|
||||||
|
ref.refresh(currentUserPlaylistsQuery);
|
||||||
|
Navigator.pop(context);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
|
@ -217,6 +217,7 @@ class Settings extends HookConsumerWidget {
|
|||||||
children: [
|
children: [
|
||||||
const Text("Download lyrics along with the Track"),
|
const Text("Download lyrics along with the Track"),
|
||||||
Switch.adaptive(
|
Switch.adaptive(
|
||||||
|
activeColor: Theme.of(context).primaryColor,
|
||||||
value: preferences.saveTrackLyrics,
|
value: preferences.saveTrackLyrics,
|
||||||
onChanged: (state) {
|
onChanged: (state) {
|
||||||
preferences.setSaveTrackLyrics(state);
|
preferences.setSaveTrackLyrics(state);
|
||||||
@ -265,6 +266,22 @@ class Settings extends HookConsumerWidget {
|
|||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
const Expanded(
|
||||||
|
flex: 2,
|
||||||
|
child: Text("Check for Update)"),
|
||||||
|
),
|
||||||
|
Switch.adaptive(
|
||||||
|
activeColor: Theme.of(context).primaryColor,
|
||||||
|
value: preferences.checkUpdate,
|
||||||
|
onChanged: (checked) =>
|
||||||
|
preferences.setCheckUpdate(checked),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
if (auth.isLoggedIn)
|
if (auth.isLoggedIn)
|
||||||
Builder(builder: (context) {
|
Builder(builder: (context) {
|
||||||
Auth auth = ref.watch(authProvider);
|
Auth auth = ref.watch(authProvider);
|
||||||
|
90
lib/hooks/useUpdateChecker.dart
Normal file
90
lib/hooks/useUpdateChecker.dart
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
import 'package:spotube/components/Shared/AnchorButton.dart';
|
||||||
|
import 'package:spotube/hooks/usePackageInfo.dart';
|
||||||
|
import 'package:spotube/provider/UserPreferences.dart';
|
||||||
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
import 'package:version/version.dart';
|
||||||
|
|
||||||
|
void useUpdateChecker(WidgetRef ref) {
|
||||||
|
final isCheckUpdateEnabled =
|
||||||
|
ref.watch(userPreferencesProvider.select((s) => s.checkUpdate));
|
||||||
|
final packageInfo = usePackageInfo(
|
||||||
|
appName: 'Spotube',
|
||||||
|
packageName: 'spotube',
|
||||||
|
);
|
||||||
|
final Future<List<Version?>> Function() checkUpdate = useCallback(
|
||||||
|
() async {
|
||||||
|
final value = await http.get(
|
||||||
|
Uri.parse(
|
||||||
|
"https://api.github.com/repos/KRTirtho/spotube/releases/latest"),
|
||||||
|
);
|
||||||
|
final tagName =
|
||||||
|
(jsonDecode(value.body)["tag_name"] as String).replaceAll("v", "");
|
||||||
|
final currentVersion = packageInfo.version == "Unknown"
|
||||||
|
? null
|
||||||
|
: Version.parse(
|
||||||
|
packageInfo.version,
|
||||||
|
);
|
||||||
|
final latestVersion = Version.parse(tagName);
|
||||||
|
return [currentVersion, latestVersion];
|
||||||
|
},
|
||||||
|
[packageInfo.version],
|
||||||
|
);
|
||||||
|
|
||||||
|
final context = useContext();
|
||||||
|
|
||||||
|
download(String url) => launchUrlString(
|
||||||
|
url,
|
||||||
|
mode: LaunchMode.externalApplication,
|
||||||
|
);
|
||||||
|
|
||||||
|
useEffect(() {
|
||||||
|
if (!isCheckUpdateEnabled) return null;
|
||||||
|
checkUpdate().then((value) {
|
||||||
|
if (value.first == null) return;
|
||||||
|
if (value.first! <= value.last) return;
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
final url =
|
||||||
|
"https://github.com/KRTirtho/spotube/releases/tag/v${value.last}";
|
||||||
|
return AlertDialog(
|
||||||
|
title: const Text("Spotube has an update"),
|
||||||
|
actions: [
|
||||||
|
ElevatedButton(
|
||||||
|
child: const Text("Download Now"),
|
||||||
|
onPressed: () => download(url),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
content: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Text("Spotube v${value.last} has been released"),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
const Text("Read the latest "),
|
||||||
|
AnchorButton(
|
||||||
|
"release notes",
|
||||||
|
style: const TextStyle(color: Colors.blue),
|
||||||
|
onTap: () => launchUrlString(
|
||||||
|
url,
|
||||||
|
mode: LaunchMode.externalApplication,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return null;
|
||||||
|
}, [packageInfo, isCheckUpdateEnabled]);
|
||||||
|
}
|
@ -20,6 +20,8 @@ class UserPreferences extends PersistedChangeNotifier {
|
|||||||
HotKey? prevTrackHotKey;
|
HotKey? prevTrackHotKey;
|
||||||
HotKey? playPauseHotKey;
|
HotKey? playPauseHotKey;
|
||||||
|
|
||||||
|
bool checkUpdate;
|
||||||
|
|
||||||
MaterialColor accentColorScheme;
|
MaterialColor accentColorScheme;
|
||||||
MaterialColor backgroundColorScheme;
|
MaterialColor backgroundColorScheme;
|
||||||
UserPreferences({
|
UserPreferences({
|
||||||
@ -33,6 +35,7 @@ class UserPreferences extends PersistedChangeNotifier {
|
|||||||
this.nextTrackHotKey,
|
this.nextTrackHotKey,
|
||||||
this.prevTrackHotKey,
|
this.prevTrackHotKey,
|
||||||
this.playPauseHotKey,
|
this.playPauseHotKey,
|
||||||
|
this.checkUpdate = true,
|
||||||
}) : super();
|
}) : super();
|
||||||
|
|
||||||
void setThemeMode(ThemeMode mode) {
|
void setThemeMode(ThemeMode mode) {
|
||||||
@ -95,10 +98,17 @@ class UserPreferences extends PersistedChangeNotifier {
|
|||||||
updatePersistence();
|
updatePersistence();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setCheckUpdate(bool check) {
|
||||||
|
checkUpdate = check;
|
||||||
|
notifyListeners();
|
||||||
|
updatePersistence();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
FutureOr<void> loadFromLocal(Map<String, dynamic> map) {
|
FutureOr<void> loadFromLocal(Map<String, dynamic> map) {
|
||||||
saveTrackLyrics = map["saveTrackLyrics"] ?? false;
|
saveTrackLyrics = map["saveTrackLyrics"] ?? false;
|
||||||
recommendationMarket = map["recommendationMarket"] ?? recommendationMarket;
|
recommendationMarket = map["recommendationMarket"] ?? recommendationMarket;
|
||||||
|
checkUpdate = map["checkUpdate"] ?? checkUpdate;
|
||||||
geniusAccessToken =
|
geniusAccessToken =
|
||||||
map["geniusAccessToken"] ?? getRandomElement(lyricsSecrets);
|
map["geniusAccessToken"] ?? getRandomElement(lyricsSecrets);
|
||||||
nextTrackHotKey = map["nextTrackHotKey"] != null
|
nextTrackHotKey = map["nextTrackHotKey"] != null
|
||||||
@ -133,6 +143,7 @@ class UserPreferences extends PersistedChangeNotifier {
|
|||||||
"themeMode": themeMode.index,
|
"themeMode": themeMode.index,
|
||||||
"backgroundColorScheme": backgroundColorScheme.value,
|
"backgroundColorScheme": backgroundColorScheme.value,
|
||||||
"accentColorScheme": accentColorScheme.value,
|
"accentColorScheme": accentColorScheme.value,
|
||||||
|
"checkUpdate": checkUpdate,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -870,6 +870,13 @@ packages:
|
|||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.2"
|
version: "2.1.2"
|
||||||
|
version:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: version
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
win32:
|
win32:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -61,6 +61,7 @@ dependencies:
|
|||||||
marquee: ^2.2.1
|
marquee: ^2.2.1
|
||||||
scroll_to_index: ^2.1.1
|
scroll_to_index: ^2.1.1
|
||||||
package_info_plus: ^1.4.2
|
package_info_plus: ^1.4.2
|
||||||
|
version: ^2.0.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
Loading…
Reference in New Issue
Block a user