// ignore_for_file: use_build_context_synchronously import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:window_manager/window_manager.dart' hide WindowCaption; import 'widgets/widgets.dart' show WindowCaption; import 'providers/providers.dart'; import 'screens/screens.dart'; import 'consts.dart'; class App extends ConsumerStatefulWidget { const App({super.key}); @override ConsumerState createState() => _AppState(); } class _AppState extends ConsumerState with WindowListener { @override void initState() { super.initState(); windowManager.addListener(this); _init(); } @override void dispose() { windowManager.removeListener(this); super.dispose(); } void _init() async { // Add this line to override the default close handler await windowManager.setPreventClose(true); setState(() {}); } @override void onWindowResized() { windowManager.getSize().then((value) { ref.read(settingsProvider.notifier).update(size: value); }); windowManager.getPosition().then((value) { ref.read(settingsProvider.notifier).update(offset: value); }); } @override void onWindowMoved() { windowManager.getPosition().then((value) { ref.read(settingsProvider.notifier).update(offset: value); }); } @override void onWindowClose() async { bool isPreventClose = await windowManager.isPreventClose(); if (isPreventClose) { if (ref.watch( settingsProvider.select((value) => value.promptBeforeClosing))) { showDialog( context: context, builder: (_) => AlertDialog( title: const Text('Save Changes'), content: const Text('Want to save changes before you close API Dash?'), actions: [ OutlinedButton( child: const Text('No'), onPressed: () async { Navigator.of(context).pop(); await windowManager.destroy(); }, ), FilledButton( child: const Text('Save'), onPressed: () async { await ref .read(collectionStateNotifierProvider.notifier) .saveData(); Navigator.of(context).pop(); await windowManager.destroy(); }, ), ], ), ); } else { await windowManager.destroy(); } } } @override Widget build(BuildContext context) { return const Dashboard(); } } class DashApp extends ConsumerWidget { const DashApp({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final isDarkMode = ref.watch(settingsProvider.select((value) => value.isDark)); return MaterialApp( debugShowCheckedModeBanner: false, theme: ThemeData( fontFamily: kFontFamily, fontFamilyFallback: kFontFamilyFallback, colorSchemeSeed: kColorSchemeSeed, useMaterial3: true, brightness: Brightness.light, visualDensity: VisualDensity.adaptivePlatformDensity, ), darkTheme: ThemeData( fontFamily: kFontFamily, fontFamilyFallback: kFontFamilyFallback, colorSchemeSeed: kColorSchemeSeed, useMaterial3: true, brightness: Brightness.dark, visualDensity: VisualDensity.adaptivePlatformDensity, ), themeMode: isDarkMode ? ThemeMode.dark : ThemeMode.light, home: kIsMobile ? const MobileDashboard( title: 'Requests', scaffoldBody: CollectionPane(), ) : Stack( children: [ kIsLinux ? const Dashboard() : const App(), if (kIsWindows) SizedBox( height: 29, child: WindowCaption( backgroundColor: Colors.transparent, brightness: isDarkMode ? Brightness.dark : Brightness.light, ), ), ], ), ); } }