mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-12 23:45:18 +00:00

Custom bg-color for floating player for each title track album art go_true routing integrated floating player now disappears if not on home
209 lines
6.7 KiB
Dart
209 lines
6.7 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:spotify/spotify.dart';
|
|
import 'package:spotube/components/Album/AlbumView.dart';
|
|
import 'package:spotube/components/Artist/ArtistAlbumView.dart';
|
|
import 'package:spotube/components/Artist/ArtistProfile.dart';
|
|
import 'package:spotube/components/Home/Home.dart';
|
|
import 'package:spotube/components/Playlist/PlaylistView.dart';
|
|
import 'package:spotube/components/Settings.dart';
|
|
import 'package:spotube/components/Shared/SpotubePageRoute.dart';
|
|
import 'package:spotube/models/LocalStorageKeys.dart';
|
|
import 'package:spotube/provider/ThemeProvider.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 = GoRouter(
|
|
routes: [
|
|
GoRoute(
|
|
path: "/",
|
|
builder: (context, state) => const Home(),
|
|
),
|
|
GoRoute(
|
|
path: "/settings",
|
|
pageBuilder: (context, state) => SpotubePage(
|
|
child: const Settings(),
|
|
),
|
|
),
|
|
GoRoute(
|
|
path: "/album/:id",
|
|
pageBuilder: (context, state) {
|
|
assert(state.extra is AlbumSimple);
|
|
return SpotubePage(child: AlbumView(state.extra as AlbumSimple));
|
|
},
|
|
),
|
|
GoRoute(
|
|
path: "/artist/:id",
|
|
pageBuilder: (context, state) {
|
|
assert(state.params["id"] != null);
|
|
return SpotubePage(child: ArtistProfile(state.params["id"]!));
|
|
},
|
|
),
|
|
GoRoute(
|
|
path: "/artist-album/:id",
|
|
pageBuilder: (context, state) {
|
|
assert(state.params["id"] != null);
|
|
assert(state.extra is String);
|
|
return SpotubePage(
|
|
child: ArtistAlbumView(
|
|
state.params["id"]!,
|
|
state.extra as String,
|
|
),
|
|
);
|
|
},
|
|
),
|
|
GoRoute(
|
|
path: "/playlist/:id",
|
|
pageBuilder: (context, state) {
|
|
assert(state.extra is PlaylistSimple);
|
|
return SpotubePage(
|
|
child: PlaylistView(state.extra as PlaylistSimple),
|
|
);
|
|
},
|
|
),
|
|
],
|
|
);
|
|
@override
|
|
Widget build(BuildContext context, ref) {
|
|
var themeMode = ref.watch(themeProvider);
|
|
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 null;
|
|
}, []);
|
|
|
|
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,
|
|
);
|
|
}
|
|
}
|