TetraStats/lib/main.dart

192 lines
6.7 KiB
Dart
Raw Normal View History

import 'dart:async';
import 'dart:io';
2023-07-20 20:56:00 +00:00
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'dart:developer' as developer;
import 'package:package_info_plus/package_info_plus.dart';
2023-07-15 16:22:25 +00:00
import 'package:shared_preferences/shared_preferences.dart';
import 'package:tetra_stats/services/tetrio_crud.dart';
import 'package:tetra_stats/views/customization_view.dart';
2024-06-11 16:30:13 +00:00
import 'package:tetra_stats/views/ranks_averages_view.dart';
import 'package:tetra_stats/views/sprint_and_blitz_averages.dart';
import 'package:tetra_stats/views/tl_leaderboard_view.dart';
import 'package:window_manager/window_manager.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
2023-07-20 20:56:00 +00:00
import 'package:sqflite_common_ffi_web/sqflite_ffi_web.dart';
import 'package:tetra_stats/gen/strings.g.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
2024-09-13 22:00:11 +00:00
import 'package:tetra_stats/views/main_view_tiles.dart';
import 'package:tetra_stats/views/settings_view.dart';
import 'package:tetra_stats/views/tracked_players_view.dart';
import 'package:tetra_stats/views/calc_view.dart';
2023-12-26 22:02:47 +00:00
import 'package:go_router/go_router.dart';
late final PackageInfo packageInfo;
late SharedPreferences prefs;
late TetrioService teto;
2024-07-27 19:10:45 +00:00
ThemeData theme = ThemeData(
fontFamily: 'Eurostile Round',
colorScheme: const ColorScheme.dark(
primary: Colors.cyanAccent,
surface: Color.fromARGB(255, 10, 10, 10),
2024-08-06 22:24:31 +00:00
secondary: Color(0xFF00838F),
2024-07-27 19:10:45 +00:00
),
cardTheme: const CardTheme(surfaceTintColor: Color.fromARGB(255, 10, 10, 10)),
drawerTheme: const DrawerThemeData(surfaceTintColor: Color.fromARGB(255, 10, 10, 10)),
searchBarTheme: const SearchBarThemeData(
shadowColor: WidgetStatePropertyAll(Colors.black),
shape: WidgetStatePropertyAll(RoundedRectangleBorder(borderRadius: BorderRadius.horizontal(left: Radius.circular(12.0), right: Radius.circular(12.0)))),
elevation: WidgetStatePropertyAll(8.0)
),
chipTheme: const ChipThemeData(
2024-08-06 22:24:31 +00:00
side: BorderSide(color: Colors.transparent),
),
segmentedButtonTheme: SegmentedButtonThemeData(
style: ButtonStyle(
side: const WidgetStatePropertyAll(BorderSide(color: Colors.transparent)),
surfaceTintColor: const WidgetStatePropertyAll(Colors.cyanAccent),
iconColor: const WidgetStatePropertyAll(Colors.cyanAccent),
2024-08-06 22:24:31 +00:00
shadowColor: WidgetStatePropertyAll(Colors.cyanAccent.shade200),
)
),
2024-10-05 22:32:09 +00:00
dividerColor: Color.fromARGB(50, 158, 158, 158),
dividerTheme: DividerThemeData(color: Color.fromARGB(50, 158, 158, 158)),
2024-10-06 22:25:55 +00:00
expansionTileTheme: ExpansionTileThemeData(
expansionAnimationStyle: AnimationStyle(curve: Easing.standard, reverseCurve: Easing.standard),
expandedAlignment: Alignment.bottomCenter,
),
2024-07-27 19:10:45 +00:00
scaffoldBackgroundColor: Colors.black
);
2024-06-11 16:30:13 +00:00
2023-12-26 22:02:47 +00:00
final router = GoRouter(
2024-01-03 17:43:03 +00:00
initialLocation: "/",
2023-12-26 22:02:47 +00:00
routes: [
GoRoute(
path: "/",
builder: (_, __) => const MainView(),
routes: [
GoRoute(
path: 'settings',
builder: (_, __) => const SettingsView(),
2024-06-11 16:30:13 +00:00
routes: [
GoRoute(
path: 'customization',
builder: (_, __) => const CustomizationView(),
),
]
),
GoRoute(
path: "leaderboard",
builder: (_, __) => const TLLeaderboardView(),
routes: [
GoRoute(
path: "LBvalues",
builder: (_, __) => const RankAveragesView(),
),
]
),
GoRoute(
path: "LBvalues",
builder: (_, __) => const RankAveragesView(),
2023-12-26 22:02:47 +00:00
),
GoRoute(
path: 'states',
builder: (_, __) => const TrackedPlayersView(),
),
GoRoute(
path: 'calc',
builder: (_, __) => const CalcView(),
),
GoRoute(
2024-06-11 16:30:13 +00:00
path: 'sprintAndBlitzAverages',
builder: (_, __) => const SprintAndBlitzView(),
)
2023-12-26 22:02:47 +00:00
]
2023-12-26 22:55:51 +00:00
),
2024-01-26 20:56:24 +00:00
GoRoute( // that one intended for Android users, that can open https://ch.tetr.io/u/ links
2023-12-26 22:55:51 +00:00
path: "/u/:userId",
builder: (_, __) => MainView(player: __.pathParameters['userId'])
2023-12-26 22:02:47 +00:00
)
],
);
2023-07-15 16:22:25 +00:00
void main() async {
2024-01-26 20:56:24 +00:00
// Initializing sqflite
2023-07-20 20:56:00 +00:00
if (kIsWeb) {
sqfliteFfiInit();
databaseFactory = databaseFactoryFfiWeb;
} else if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) {
sqfliteFfiInit();
databaseFactory = databaseFactoryFfi;
}
2024-01-26 20:56:24 +00:00
// Initializing funny things
2023-07-15 16:22:25 +00:00
WidgetsFlutterBinding.ensureInitialized();
2024-01-26 20:56:24 +00:00
if (!kIsWeb && !Platform.isAndroid && !Platform.isIOS){ // we can't control windows manager in web and mobile
await WindowManager.instance.ensureInitialized(); // Initializing windows manager
windowManager.waitUntilReadyToShow().then((_) async {
2024-01-26 20:56:24 +00:00
await windowManager.setTitle('Tetra Stats'); // And setting the windows title
});
}
2024-01-26 20:56:24 +00:00
packageInfo = await PackageInfo.fromPlatform();
2023-07-15 16:22:25 +00:00
prefs = await SharedPreferences.getInstance();
teto = TetrioService();
2024-01-26 20:56:24 +00:00
// Choosing the locale
2023-07-15 16:22:25 +00:00
String? locale = prefs.getString("locale");
if (locale == null){
LocaleSettings.useDeviceLocale();
}else{
LocaleSettings.setLocaleRaw(locale);
}
// I dont want to store old cache
2024-06-16 21:04:07 +00:00
Timer.periodic(const Duration(minutes: 5), (Timer timer) {
teto.cacheRoutine();
2024-06-16 21:04:07 +00:00
developer.log("Cache routine complete, next one in ${DateTime.now().add(const Duration(minutes: 5))}", name: "main");
2024-06-11 16:30:13 +00:00
// if (prefs.getBool("updateInBG") == true) teto.fetchTracked(); // TODO: Somehow avoid doing that in main isolate
});
2024-01-26 20:56:24 +00:00
runApp(TranslationProvider(
child: const MyApp(),
));
}
class MyApp extends StatefulWidget {
2023-07-15 16:22:25 +00:00
const MyApp({super.key});
@override
State<MyApp> createState() => MyAppState();
}
class MyAppState extends State<MyApp> {
2024-06-16 21:04:07 +00:00
@override
void initState() {
setAccentColor(prefs.getInt("accentColor") != null ? Color(prefs.getInt("accentColor")!) : Colors.cyanAccent);
super.initState();
}
void setAccentColor(Color color){ // does this thing work??? yes??? no???
setState(() {
theme = theme.copyWith(colorScheme: theme.colorScheme.copyWith(primary: color));
});
}
@override
Widget build(BuildContext context) {
2023-12-26 22:02:47 +00:00
return MaterialApp.router(
2024-01-26 20:56:24 +00:00
title: "Tetra Stats",
routerConfig: router,
scrollBehavior: const MaterialScrollBehavior().copyWith(
2023-07-20 20:56:00 +00:00
dragDevices: {PointerDeviceKind.mouse, PointerDeviceKind.touch, PointerDeviceKind.stylus, PointerDeviceKind.unknown},
2024-01-26 20:56:24 +00:00
),
locale: TranslationProvider.of(context).flutterLocale,
supportedLocales: AppLocaleUtils.supportedLocales,
localizationsDelegates: GlobalMaterialLocalizations.delegates,
theme: theme
2024-01-26 20:56:24 +00:00
);
}
2024-07-27 19:10:45 +00:00
}