fix: keyboard shortcuts changing route but not update sidebar

This commit is contained in:
Kingkor Roy Tirtho 2023-09-26 18:47:31 +06:00
parent 6dced5ece0
commit 2d93441188
7 changed files with 66 additions and 23 deletions

View File

@ -44,6 +44,13 @@ class Assets {
static const String spotubeLogoSvg = 'assets/spotube-logo.svg'; static const String spotubeLogoSvg = 'assets/spotube-logo.svg';
static const AssetGenImage spotubeLogoAndroid12 = static const AssetGenImage spotubeLogoAndroid12 =
AssetGenImage('assets/spotube-logo_android12.png'); AssetGenImage('assets/spotube-logo_android12.png');
static const AssetGenImage spotubeNightlyLogoForeground =
AssetGenImage('assets/spotube-nightly-logo-foreground.jpg');
static const AssetGenImage spotubeNightlyLogoPng =
AssetGenImage('assets/spotube-nightly-logo.png');
static const String spotubeNightlyLogoSvg = 'assets/spotube-nightly-logo.svg';
static const AssetGenImage spotubeNightlyLogoAndroid12 =
AssetGenImage('assets/spotube-nightly-logo_android12.png');
static const AssetGenImage spotubeScreenshot = static const AssetGenImage spotubeScreenshot =
AssetGenImage('assets/spotube-screenshot.png'); AssetGenImage('assets/spotube-screenshot.png');
static const AssetGenImage spotubeBanner = static const AssetGenImage spotubeBanner =
@ -65,6 +72,10 @@ class Assets {
spotubeLogoPng, spotubeLogoPng,
spotubeLogoSvg, spotubeLogoSvg,
spotubeLogoAndroid12, spotubeLogoAndroid12,
spotubeNightlyLogoForeground,
spotubeNightlyLogoPng,
spotubeNightlyLogoSvg,
spotubeNightlyLogoAndroid12,
spotubeScreenshot, spotubeScreenshot,
spotubeBanner, spotubeBanner,
success, success,

View File

@ -1,5 +1,6 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_desktop_tools/flutter_desktop_tools.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:spotube/components/player/player_controls.dart'; import 'package:spotube/components/player/player_controls.dart';
@ -8,7 +9,6 @@ import 'package:spotube/models/logger.dart';
import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart';
import 'package:spotube/services/audio_player/audio_player.dart'; import 'package:spotube/services/audio_player/audio_player.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';
import 'package:window_manager/window_manager.dart';
class PlayPauseIntent extends Intent { class PlayPauseIntent extends Intent {
final WidgetRef ref; final WidgetRef ref;
@ -115,7 +115,7 @@ class CloseAppAction extends Action<CloseAppIntent> {
@override @override
invoke(intent) { invoke(intent) {
if (kIsDesktop) { if (kIsDesktop) {
windowManager.close(); DesktopTools.window.close();
} else { } else {
SystemNavigator.pop(); SystemNavigator.pop();
} }

View File

@ -69,8 +69,17 @@ class Sidebar extends HookConsumerWidget {
Color.lerp(bg, Colors.black, 0.45)!, Color.lerp(bg, Colors.black, 0.45)!,
); );
final sidebarTileList = final sidebarTileList = useMemoized(
useMemoized(() => getSidebarTileList(context.l10n), [context.l10n]); () => getSidebarTileList(context.l10n),
[context.l10n],
);
useEffect(() {
if (controller.selectedIndex != selectedIndex) {
controller.selectIndex(selectedIndex);
}
return null;
}, [selectedIndex]);
useEffect(() { useEffect(() {
controller.addListener(() { controller.addListener(() {

View File

@ -4,7 +4,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/provider/user_preferences_provider.dart'; import 'package:spotube/provider/user_preferences_provider.dart';
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';
import 'package:titlebar_buttons/titlebar_buttons.dart'; import 'package:titlebar_buttons/titlebar_buttons.dart';
import 'package:window_manager/window_manager.dart';
import 'dart:math'; import 'dart:math';
import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/foundation.dart' show kIsWeb;
import 'dart:io' show Platform; import 'dart:io' show Platform;
@ -18,7 +17,7 @@ final closeNotification = DesktopTools.createNotification(
LocalNotificationAction(text: 'Close The App'), LocalNotificationAction(text: 'Close The App'),
], ],
)?..onClickAction = (value) { )?..onClickAction = (value) {
windowManager.close(); DesktopTools.window.close();
}; };
class PageWindowTitleBar extends StatefulHookConsumerWidget class PageWindowTitleBar extends StatefulHookConsumerWidget
@ -114,16 +113,16 @@ class WindowTitleBarButtons extends HookConsumerWidget {
Future<void> onClose() async { Future<void> onClose() async {
if (preferences.closeBehavior == CloseBehavior.close) { if (preferences.closeBehavior == CloseBehavior.close) {
await windowManager.close(); await DesktopTools.window.close();
} else { } else {
await windowManager.hide(); await DesktopTools.window.hide();
await closeNotification?.show(); await closeNotification?.show();
} }
} }
useEffect(() { useEffect(() {
if (kIsDesktop) { if (kIsDesktop) {
windowManager.isMaximized().then((value) { DesktopTools.window.isMaximized().then((value) {
isMaximized.value = value; isMaximized.value = value;
}); });
} }
@ -160,14 +159,14 @@ class WindowTitleBarButtons extends HookConsumerWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
MinimizeWindowButton( MinimizeWindowButton(
onPressed: windowManager.minimize, onPressed: DesktopTools.window.minimize,
colors: colors, colors: colors,
), ),
if (isMaximized.value != true) if (isMaximized.value != true)
MaximizeWindowButton( MaximizeWindowButton(
colors: colors, colors: colors,
onPressed: () { onPressed: () {
windowManager.maximize(); DesktopTools.window.maximize();
isMaximized.value = true; isMaximized.value = true;
}, },
) )
@ -175,7 +174,7 @@ class WindowTitleBarButtons extends HookConsumerWidget {
RestoreWindowButton( RestoreWindowButton(
colors: colors, colors: colors,
onPressed: () { onPressed: () {
windowManager.unmaximize(); DesktopTools.window.unmaximize();
isMaximized.value = false; isMaximized.value = false;
}, },
), ),
@ -195,16 +194,16 @@ class WindowTitleBarButtons extends HookConsumerWidget {
children: [ children: [
DecoratedMinimizeButton( DecoratedMinimizeButton(
type: type, type: type,
onPressed: windowManager.minimize, onPressed: DesktopTools.window.minimize,
), ),
DecoratedMaximizeButton( DecoratedMaximizeButton(
type: type, type: type,
onPressed: () async { onPressed: () async {
if (await windowManager.isMaximized()) { if (await DesktopTools.window.isMaximized()) {
await windowManager.unmaximize(); await DesktopTools.window.unmaximize();
isMaximized.value = false; isMaximized.value = false;
} else { } else {
await windowManager.maximize(); await DesktopTools.window.maximize();
isMaximized.value = true; isMaximized.value = true;
} }
}, },

View File

@ -37,3 +37,13 @@ extension DurationToHumanReadableString on Duration {
abbreviated: abbreviated, abbreviated: abbreviated,
); );
} }
extension ParseDuration on Duration {
static Duration fromString(String duration) {
final parts = duration.split(':').reversed.toList();
final seconds = int.parse(parts[0]);
final minutes = parts.length > 1 ? int.parse(parts[1]) : 0;
final hours = parts.length > 2 ? int.parse(parts[2]) : 0;
return Duration(hours: hours, minutes: minutes, seconds: seconds);
}
}

View File

@ -204,9 +204,7 @@ class SpotubeState extends ConsumerState<Spotube> {
GlobalWidgetsLocalizations.delegate, GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
], ],
routeInformationParser: router.routeInformationParser, routerConfig: router,
routerDelegate: router.routerDelegate,
routeInformationProvider: router.routeInformationProvider,
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
title: 'Spotube', title: 'Spotube',
builder: (context, child) { builder: (context, child) {
@ -229,22 +227,22 @@ class SpotubeState extends ConsumerState<Spotube> {
LogicalKeySet(LogicalKeyboardKey.comma, LogicalKeyboardKey.control): LogicalKeySet(LogicalKeyboardKey.comma, LogicalKeyboardKey.control):
NavigationIntent(router, "/settings"), NavigationIntent(router, "/settings"),
LogicalKeySet( LogicalKeySet(
LogicalKeyboardKey.keyB, LogicalKeyboardKey.digit1,
LogicalKeyboardKey.control, LogicalKeyboardKey.control,
LogicalKeyboardKey.shift, LogicalKeyboardKey.shift,
): HomeTabIntent(ref, tab: HomeTabs.browse), ): HomeTabIntent(ref, tab: HomeTabs.browse),
LogicalKeySet( LogicalKeySet(
LogicalKeyboardKey.keyS, LogicalKeyboardKey.digit2,
LogicalKeyboardKey.control, LogicalKeyboardKey.control,
LogicalKeyboardKey.shift, LogicalKeyboardKey.shift,
): HomeTabIntent(ref, tab: HomeTabs.search), ): HomeTabIntent(ref, tab: HomeTabs.search),
LogicalKeySet( LogicalKeySet(
LogicalKeyboardKey.keyL, LogicalKeyboardKey.digit3,
LogicalKeyboardKey.control, LogicalKeyboardKey.control,
LogicalKeyboardKey.shift, LogicalKeyboardKey.shift,
): HomeTabIntent(ref, tab: HomeTabs.library), ): HomeTabIntent(ref, tab: HomeTabs.library),
LogicalKeySet( LogicalKeySet(
LogicalKeyboardKey.keyY, LogicalKeyboardKey.digit4,
LogicalKeyboardKey.control, LogicalKeyboardKey.control,
LogicalKeyboardKey.shift, LogicalKeyboardKey.shift,
): HomeTabIntent(ref, tab: HomeTabs.lyrics), ): HomeTabIntent(ref, tab: HomeTabs.lyrics),

View File

@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
@ -39,6 +40,21 @@ class RootApp extends HookConsumerWidget {
final downloader = ref.watch(downloadManagerProvider); final downloader = ref.watch(downloadManagerProvider);
final scaffoldMessenger = ScaffoldMessenger.of(context); final scaffoldMessenger = ScaffoldMessenger.of(context);
final theme = Theme.of(context); final theme = Theme.of(context);
final location = GoRouterState.of(context).matchedLocation;
useEffect(() {
final newIndex = rootPaths.entries.firstWhereOrNull((e) {
if (e.value == "/" || location == "/") {
return location == e.value;
}
return location.startsWith(e.value);
})?.key;
if (newIndex != null) {
index.value = newIndex;
}
return null;
}, [location]);
useEffect(() { useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {