mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00

PlayerControls slider & duration are now vertical hotkey init moved to Home Player & YoutubeExplode are provided through riverpod Playback handles all things Player used to do GoRoutes are seperated from main to individual model file usePaletteColor bugfix occuring for before initilizing mount
160 lines
5.3 KiB
Dart
160 lines
5.3 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:bitsdojo_window/bitsdojo_window.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
|
import 'package:go_router/go_router.dart';
|
|
import 'package:hooks_riverpod/hooks_riverpod.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/LocalStorageKeys.dart';
|
|
import 'package:spotube/provider/AudioPlayer.dart';
|
|
import 'package:spotube/provider/ThemeProvider.dart';
|
|
import 'package:spotube/provider/YouTube.dart';
|
|
|
|
void main() async {
|
|
WidgetsFlutterBinding.ensureInitialized();
|
|
await hotKeyManager.unregisterAll();
|
|
runApp(ProviderScope(child: MyApp()));
|
|
doWhenWindowReady(() {
|
|
appWindow.minSize =
|
|
Size(Platform.isAndroid || Platform.isIOS ? 280 : 359, 700);
|
|
appWindow.size = const Size(900, 700);
|
|
appWindow.alignment = Alignment.center;
|
|
appWindow.maximize();
|
|
appWindow.show();
|
|
});
|
|
}
|
|
|
|
class MyApp extends HookConsumerWidget {
|
|
final GoRouter _router = createGoRouter();
|
|
@override
|
|
Widget build(BuildContext context, ref) {
|
|
var themeMode = ref.watch(themeProvider);
|
|
var player = ref.watch(audioPlayerProvider);
|
|
var youtube = ref.watch(youtubeProvider);
|
|
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 () {
|
|
player.dispose();
|
|
youtube.close();
|
|
};
|
|
}, []);
|
|
|
|
return MaterialApp.router(
|
|
routeInformationParser: _router.routeInformationParser,
|
|
routerDelegate: _router.routerDelegate,
|
|
debugShowCheckedModeBanner: false,
|
|
title: 'Spotube',
|
|
theme: ThemeData(
|
|
primaryColor: Colors.green,
|
|
primarySwatch: Colors.green,
|
|
buttonTheme: const ButtonThemeData(
|
|
buttonColor: Colors.green,
|
|
),
|
|
shadowColor: Colors.grey[300],
|
|
backgroundColor: Colors.white,
|
|
textTheme: TextTheme(
|
|
bodyText1: TextStyle(color: Colors.grey[850]),
|
|
headline1: TextStyle(color: Colors.grey[850]),
|
|
headline2: TextStyle(color: Colors.grey[850]),
|
|
headline3: TextStyle(color: Colors.grey[850]),
|
|
headline4: TextStyle(color: Colors.grey[850]),
|
|
headline5: TextStyle(color: Colors.grey[850]),
|
|
headline6: TextStyle(color: Colors.grey[850]),
|
|
),
|
|
listTileTheme: ListTileThemeData(
|
|
iconColor: Colors.grey[850],
|
|
horizontalTitleGap: 0,
|
|
),
|
|
inputDecorationTheme: InputDecorationTheme(
|
|
focusedBorder: OutlineInputBorder(
|
|
borderSide: BorderSide(
|
|
color: Colors.green[400]!,
|
|
width: 2.0,
|
|
),
|
|
),
|
|
enabledBorder: OutlineInputBorder(
|
|
borderSide: BorderSide(
|
|
color: Colors.grey[800]!,
|
|
),
|
|
),
|
|
),
|
|
navigationRailTheme: NavigationRailThemeData(
|
|
backgroundColor: Colors.blueGrey[50],
|
|
unselectedIconTheme:
|
|
IconThemeData(color: Colors.grey[850], opacity: 1),
|
|
unselectedLabelTextStyle: TextStyle(
|
|
color: Colors.grey[850],
|
|
),
|
|
),
|
|
navigationBarTheme: NavigationBarThemeData(
|
|
backgroundColor: Colors.blueGrey[50],
|
|
height: 55,
|
|
),
|
|
cardTheme: CardTheme(
|
|
shape:
|
|
RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
|
|
color: Colors.white,
|
|
),
|
|
),
|
|
darkTheme: ThemeData(
|
|
brightness: Brightness.dark,
|
|
primaryColor: Colors.green,
|
|
primarySwatch: Colors.green,
|
|
backgroundColor: Colors.blueGrey[900],
|
|
scaffoldBackgroundColor: Colors.blueGrey[900],
|
|
dialogBackgroundColor: Colors.blueGrey[800],
|
|
shadowColor: Colors.black26,
|
|
buttonTheme: const ButtonThemeData(
|
|
buttonColor: Colors.green,
|
|
),
|
|
inputDecorationTheme: InputDecorationTheme(
|
|
focusedBorder: OutlineInputBorder(
|
|
borderSide: BorderSide(
|
|
color: Colors.green[400]!,
|
|
width: 2.0,
|
|
),
|
|
),
|
|
enabledBorder: OutlineInputBorder(
|
|
borderSide: BorderSide(
|
|
color: Colors.grey[800]!,
|
|
),
|
|
),
|
|
),
|
|
navigationRailTheme: NavigationRailThemeData(
|
|
backgroundColor: Colors.blueGrey[800],
|
|
unselectedIconTheme: const IconThemeData(opacity: 1),
|
|
),
|
|
navigationBarTheme: NavigationBarThemeData(
|
|
backgroundColor: Colors.blueGrey[800],
|
|
height: 55,
|
|
),
|
|
cardTheme: CardTheme(
|
|
shape:
|
|
RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
|
|
color: Colors.blueGrey[900],
|
|
elevation: 20,
|
|
),
|
|
canvasColor: Colors.blueGrey[900],
|
|
),
|
|
themeMode: themeMode,
|
|
);
|
|
}
|
|
}
|