mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-07 21:48:14 -08:00
164 lines
6.3 KiB
Dart
164 lines
6.3 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:auto_route/auto_route.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:iconsax_plus/iconsax_plus.dart';
|
|
import 'package:window_manager/window_manager.dart';
|
|
|
|
import 'package:fladder/models/settings/client_settings_model.dart';
|
|
import 'package:fladder/providers/settings/client_settings_provider.dart';
|
|
import 'package:fladder/providers/user_provider.dart';
|
|
import 'package:fladder/routes/auto_router.gr.dart';
|
|
import 'package:fladder/screens/shared/fladder_snackbar.dart';
|
|
import 'package:fladder/util/input_handler.dart';
|
|
import 'package:fladder/util/localization_helper.dart';
|
|
import 'package:fladder/util/string_extensions.dart';
|
|
import 'package:fladder/widgets/keyboard/slide_in_keyboard.dart';
|
|
import 'package:fladder/widgets/navigation_scaffold/components/adaptive_fab.dart';
|
|
import 'package:fladder/widgets/navigation_scaffold/components/destination_model.dart';
|
|
import 'package:fladder/widgets/navigation_scaffold/navigation_scaffold.dart';
|
|
|
|
enum HomeTabs {
|
|
dashboard,
|
|
library,
|
|
favorites,
|
|
sync;
|
|
|
|
const HomeTabs();
|
|
|
|
IconData get icon => switch (this) {
|
|
HomeTabs.dashboard => IconsaxPlusLinear.home_1,
|
|
HomeTabs.library => IconsaxPlusLinear.book,
|
|
HomeTabs.favorites => IconsaxPlusLinear.heart,
|
|
HomeTabs.sync => IconsaxPlusLinear.cloud,
|
|
};
|
|
|
|
IconData get selectedIcon => switch (this) {
|
|
HomeTabs.dashboard => IconsaxPlusBold.home_1,
|
|
HomeTabs.library => IconsaxPlusBold.book,
|
|
HomeTabs.favorites => IconsaxPlusBold.heart,
|
|
HomeTabs.sync => IconsaxPlusBold.cloud,
|
|
};
|
|
|
|
Future navigate(BuildContext context) => switch (this) {
|
|
HomeTabs.dashboard => context.router.navigate(const DashboardRoute()),
|
|
HomeTabs.library => context.router.navigate(const LibraryRoute()),
|
|
HomeTabs.favorites => context.router.navigate(const FavouritesRoute()),
|
|
HomeTabs.sync => context.router.navigate(const SyncedRoute()),
|
|
};
|
|
|
|
String label(BuildContext context) => switch (this) {
|
|
HomeTabs.dashboard => context.localized.dashboard,
|
|
HomeTabs.library => context.localized.library(0),
|
|
HomeTabs.favorites => context.localized.favorites,
|
|
HomeTabs.sync => context.localized.sync,
|
|
};
|
|
}
|
|
|
|
@RoutePage()
|
|
class HomeScreen extends ConsumerWidget {
|
|
const HomeScreen({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final canDownload = ref.watch(showSyncButtonProviderProvider);
|
|
final destinations = HomeTabs.values
|
|
.map((e) {
|
|
switch (e) {
|
|
case HomeTabs.dashboard:
|
|
return DestinationModel(
|
|
label: context.localized.navigationDashboard,
|
|
icon: Icon(e.icon),
|
|
selectedIcon: Icon(e.selectedIcon),
|
|
route: const DashboardRoute(),
|
|
action: () => e.navigate(context),
|
|
floatingActionButton: AdaptiveFab(
|
|
context: context,
|
|
title: context.localized.search,
|
|
key: Key(e.name.capitalize()),
|
|
onPressed: () => context.router.navigate(LibrarySearchRoute()),
|
|
child: const Icon(IconsaxPlusLinear.search_normal_1),
|
|
),
|
|
);
|
|
case HomeTabs.favorites:
|
|
return DestinationModel(
|
|
label: context.localized.navigationFavorites,
|
|
icon: Icon(e.icon),
|
|
selectedIcon: Icon(e.selectedIcon),
|
|
route: const FavouritesRoute(),
|
|
floatingActionButton: AdaptiveFab(
|
|
context: context,
|
|
title: context.localized.filter(0),
|
|
key: Key(e.name.capitalize()),
|
|
onPressed: () => context.router.navigate(LibrarySearchRoute(favourites: true)),
|
|
child: const Icon(IconsaxPlusLinear.heart_search),
|
|
),
|
|
action: () => e.navigate(context),
|
|
);
|
|
case HomeTabs.sync:
|
|
if (canDownload && !kIsWeb) {
|
|
return DestinationModel(
|
|
label: context.localized.navigationSync,
|
|
icon: Icon(e.icon),
|
|
selectedIcon: Icon(e.selectedIcon),
|
|
route: const SyncedRoute(),
|
|
action: () => e.navigate(context),
|
|
);
|
|
}
|
|
case HomeTabs.library:
|
|
return DestinationModel(
|
|
label: context.localized.library(0),
|
|
icon: Icon(e.icon),
|
|
selectedIcon: Icon(e.selectedIcon),
|
|
route: const LibraryRoute(),
|
|
action: () => e.navigate(context),
|
|
floatingActionButton: AdaptiveFab(
|
|
context: context,
|
|
title: context.localized.search,
|
|
key: Key(e.name.capitalize()),
|
|
onPressed: () => context.router.navigate(LibrarySearchRoute()),
|
|
child: const Icon(IconsaxPlusLinear.search_status),
|
|
),
|
|
);
|
|
}
|
|
})
|
|
.nonNulls
|
|
.toList();
|
|
return InputHandler<GlobalHotKeys>(
|
|
autoFocus: false,
|
|
keyMapResult: (result) {
|
|
switch (result) {
|
|
case GlobalHotKeys.search:
|
|
context.navigateTo(LibrarySearchRoute());
|
|
return true;
|
|
case GlobalHotKeys.exit:
|
|
Future.microtask(() async {
|
|
final manager = WindowManager.instance;
|
|
if (await manager.isClosable()) {
|
|
manager.close();
|
|
} else {
|
|
fladderSnackbar(context, title: context.localized.somethingWentWrong);
|
|
}
|
|
});
|
|
return true;
|
|
}
|
|
},
|
|
keyMap: ref.watch(clientSettingsProvider.select((value) => value.currentShortcuts)),
|
|
child: HeroControllerScope(
|
|
controller: HeroController(),
|
|
child: AutoRouter(
|
|
builder: (context, child) {
|
|
return CustomKeyboardWrapper(
|
|
child: NavigationScaffold(
|
|
destinations: destinations.nonNulls.toList(),
|
|
currentRouteName: context.router.current.name,
|
|
nestedChild: child,
|
|
),
|
|
);
|
|
},
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|