forked from firka/student-legacy
169 lines
5.3 KiB
Dart
169 lines
5.3 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:refilc/api/providers/news_provider.dart';
|
|
import 'package:refilc/api/providers/sync.dart';
|
|
import 'package:refilc/theme/colors/colors.dart';
|
|
import 'package:refilc/theme/observer.dart';
|
|
import 'package:refilc_desktop_ui/screens/navigation/navigation_route.dart';
|
|
import 'package:refilc_desktop_ui/screens/navigation/navigation_route_handler.dart';
|
|
import 'package:refilc_desktop_ui/screens/navigation/sidebar.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_acrylic/flutter_acrylic.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:refilc/models/settings.dart';
|
|
import 'package:refilc_kreta_api/client/client.dart';
|
|
import 'package:refilc_plus/providers/goal_provider.dart';
|
|
|
|
class NavigationScreen extends StatefulWidget {
|
|
const NavigationScreen({super.key});
|
|
|
|
static NavigationScreenState? of(BuildContext context) =>
|
|
context.findAncestorStateOfType<NavigationScreenState>();
|
|
|
|
@override
|
|
State<NavigationScreen> createState() => NavigationScreenState();
|
|
}
|
|
|
|
class NavigationScreenState extends State<NavigationScreen>
|
|
with WidgetsBindingObserver {
|
|
final _navigatorState = GlobalKey<NavigatorState>();
|
|
late NavigationRoute selected;
|
|
late SettingsProvider settings;
|
|
late NewsProvider newsProvider;
|
|
late GoalProvider goalProvider;
|
|
double topInset = 0.0;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
settings = Provider.of<SettingsProvider>(context, listen: false);
|
|
selected = NavigationRoute();
|
|
selected.index = 0;
|
|
|
|
// add brightness observer
|
|
WidgetsBinding.instance.addObserver(this);
|
|
|
|
// set client User-Agent
|
|
Provider.of<KretaClient>(context, listen: false).userAgent =
|
|
settings.config.userAgent;
|
|
|
|
// get news
|
|
newsProvider = Provider.of<NewsProvider>(context, listen: false);
|
|
newsProvider.restore().then((value) => newsProvider.fetch());
|
|
|
|
// get goals
|
|
// goalProvider = Provider.of<GoalProvider>(context, listen: false);
|
|
// goalProvider.fetchDone();
|
|
|
|
// Initial sync
|
|
syncAll(context);
|
|
|
|
// platform specific shit
|
|
() async {
|
|
try {
|
|
await Window.initialize();
|
|
} catch (_) {}
|
|
// Transparent sidebar
|
|
if (Platform.isLinux) return;
|
|
|
|
await Window.setEffect(
|
|
effect: Platform.isLinux
|
|
? WindowEffect.transparent
|
|
: WindowEffect.acrylic,
|
|
color: Platform.isMacOS
|
|
? Colors.transparent
|
|
: const Color.fromARGB(27, 27, 27, 27));
|
|
|
|
// todo: do for windows
|
|
if (Platform.isMacOS) {
|
|
topInset = await Window.getTitlebarHeight();
|
|
await Window.enableFullSizeContentView();
|
|
await Window.hideTitle();
|
|
await Window.makeTitlebarTransparent();
|
|
}
|
|
}();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
WidgetsBinding.instance.removeObserver(this);
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
void didChangePlatformBrightness() {
|
|
if (settings.theme == ThemeMode.system) {
|
|
// ignore: deprecated_member_use
|
|
Brightness? brightness =
|
|
// ignore: deprecated_member_use
|
|
WidgetsBinding.instance.window.platformBrightness;
|
|
Provider.of<ThemeModeObserver>(context, listen: false).changeTheme(
|
|
brightness == Brightness.light ? ThemeMode.light : ThemeMode.dark);
|
|
}
|
|
super.didChangePlatformBrightness();
|
|
}
|
|
|
|
void setPage(String page) => setState(() => selected.name = page);
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
settings = Provider.of<SettingsProvider>(context);
|
|
newsProvider = Provider.of<NewsProvider>(context);
|
|
goalProvider = Provider.of<GoalProvider>(context);
|
|
|
|
// show news / complete goals
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
if (newsProvider.show) {
|
|
newsProvider.lock();
|
|
// NewsView.show(newsProvider.news[newsProvider.state], context: context).then((value) => newsProvider.release());
|
|
}
|
|
if (goalProvider.hasDoneGoals) {
|
|
// to-do
|
|
}
|
|
});
|
|
|
|
return Scaffold(
|
|
backgroundColor: Colors.transparent,
|
|
body: Row(
|
|
children: [
|
|
if (_navigatorState.currentState != null)
|
|
Container(
|
|
decoration: BoxDecoration(
|
|
color:
|
|
Theme.of(context).scaffoldBackgroundColor.withOpacity(.5),
|
|
border: Border(
|
|
right: BorderSide(
|
|
color: AppColors.of(context).shadow.withOpacity(.7),
|
|
width: 1.0)),
|
|
),
|
|
child: Padding(
|
|
padding: EdgeInsets.only(top: topInset),
|
|
child: Sidebar(
|
|
navigator: _navigatorState.currentState!,
|
|
selected: selected.name,
|
|
onRouteChange: (name) => setPage(name),
|
|
),
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Container(
|
|
color: Theme.of(context).scaffoldBackgroundColor,
|
|
child: MediaQuery(
|
|
data: MediaQuery.of(context).copyWith(
|
|
padding: EdgeInsets.only(top: topInset),
|
|
),
|
|
child: Navigator(
|
|
key: _navigatorState,
|
|
initialRoute: selected.name,
|
|
onGenerateRoute: (settings) =>
|
|
navigationRouteHandler(settings),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|