lemmur-app-android/lib/main.dart

159 lines
4.0 KiB
Dart
Raw Normal View History

import 'dart:async';
2020-08-02 13:34:42 +02:00
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
2020-09-16 23:15:42 +02:00
import 'package:flutter_hooks/flutter_hooks.dart';
2020-08-30 22:43:16 +02:00
import 'package:provider/provider.dart';
2020-12-03 22:44:20 +01:00
import 'package:url_launcher/url_launcher.dart' as ul;
2020-08-30 22:43:16 +02:00
2020-09-16 23:15:42 +02:00
import 'hooks/stores.dart';
2020-09-19 23:56:07 +02:00
import 'pages/communities_tab.dart';
2020-09-22 23:51:21 +02:00
import 'pages/create_post.dart';
2020-10-04 21:52:39 +02:00
import 'pages/home_tab.dart';
2020-09-17 00:29:35 +02:00
import 'pages/profile_tab.dart';
2021-01-08 17:39:03 +01:00
import 'pages/search_tab.dart';
2020-09-01 13:22:37 +02:00
import 'stores/accounts_store.dart';
2020-08-30 22:43:16 +02:00
import 'stores/config_store.dart';
2020-08-02 13:34:42 +02:00
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
2020-09-16 23:22:04 +02:00
final configStore = ConfigStore();
await configStore.load();
2020-09-16 23:22:04 +02:00
final accountsStore = AccountsStore();
2020-09-01 13:22:37 +02:00
await accountsStore.load();
2020-08-30 22:43:16 +02:00
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider.value(
value: configStore,
2020-08-30 22:43:16 +02:00
),
ChangeNotifierProvider.value(
value: accountsStore,
2020-09-01 13:22:37 +02:00
),
2020-08-30 22:43:16 +02:00
],
2021-01-03 19:43:39 +01:00
child: const MyApp(),
2020-08-30 22:43:16 +02:00
),
);
2020-08-02 13:34:42 +02:00
}
2020-09-16 23:15:42 +02:00
class MyApp extends HookWidget {
2021-01-03 19:43:39 +01:00
const MyApp();
2020-08-02 13:34:42 +02:00
@override
2020-09-16 23:15:42 +02:00
Widget build(BuildContext context) {
final configStore = useConfigStore();
final maybeAmoledColor = configStore.amoledDarkMode ? Colors.black : null;
2020-09-16 23:15:42 +02:00
return MaterialApp(
title: 'Lemmur',
themeMode: configStore.theme,
darkTheme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: maybeAmoledColor,
backgroundColor: maybeAmoledColor,
canvasColor: maybeAmoledColor,
cardColor: maybeAmoledColor,
splashColor: maybeAmoledColor,
),
theme: ThemeData(
visualDensity: VisualDensity.adaptivePlatformDensity,
),
2021-01-03 19:43:39 +01:00
home: const MyHomePage(),
2020-09-16 23:15:42 +02:00
);
}
2020-08-02 13:34:42 +02:00
}
2020-12-03 22:44:20 +01:00
class TemporarySearchTab extends HookWidget {
2021-01-03 19:43:39 +01:00
const TemporarySearchTab();
2020-12-03 22:44:20 +01:00
@override
Widget build(BuildContext context) {
final accStore = useAccountsStore();
return ListView(
children: [
2021-01-03 19:43:39 +01:00
const ListTile(
2020-12-03 22:44:20 +01:00
title: Center(
child: Text('🚧 this tab is still under construction 🚧\n'
2020-12-03 22:50:56 +01:00
'but you can open your instances in a browser '
' for missing functionality')),
2020-12-03 22:44:20 +01:00
),
2021-01-03 19:43:39 +01:00
const Divider(),
2020-12-03 22:44:20 +01:00
for (final inst in accStore.instances)
ListTile(
title: Text(inst),
onTap: () => ul.launch('https://$inst/'),
)
],
);
}
}
class MyHomePage extends HookWidget {
2021-01-03 19:43:39 +01:00
const MyHomePage();
static const List<Widget> pages = [
2020-10-04 21:52:39 +02:00
HomeTab(),
2020-09-19 23:56:07 +02:00
CommunitiesTab(),
2021-01-08 17:39:03 +01:00
SearchTab(),
2020-09-19 23:56:07 +02:00
UserProfileTab(),
];
2020-08-02 13:34:42 +02:00
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
2020-09-19 23:56:07 +02:00
final currentTab = useState(0);
2020-08-02 13:34:42 +02:00
useEffect(() {
2020-09-17 00:29:35 +02:00
Future.microtask(
() => SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
systemNavigationBarColor: theme.scaffoldBackgroundColor,
)),
);
2020-08-02 13:34:42 +02:00
return null;
}, [theme.scaffoldBackgroundColor]);
2020-08-02 13:34:42 +02:00
2020-09-19 23:56:07 +02:00
var tabCounter = 0;
tabButton(IconData icon) {
final tabNum = tabCounter++;
return IconButton(
icon: Icon(icon),
color: tabNum == currentTab.value ? theme.accentColor : null,
onPressed: () => currentTab.value = tabNum,
);
}
return Scaffold(
2020-09-20 23:27:04 +02:00
extendBody: true,
body: IndexedStack(
index: currentTab.value,
children: pages,
2020-09-19 23:56:07 +02:00
),
2021-01-03 19:43:39 +01:00
floatingActionButton: const CreatePostFab(),
2020-09-19 23:56:07 +02:00
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
bottomNavigationBar: BottomAppBar(
2021-01-03 19:43:39 +01:00
shape: const CircularNotchedRectangle(),
2020-09-21 20:23:18 +02:00
notchMargin: 7,
2021-01-03 18:03:59 +01:00
child: SizedBox(
2020-09-19 23:56:07 +02:00
height: 60,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
tabButton(Icons.home),
tabButton(Icons.list),
2021-01-03 19:43:39 +01:00
const SizedBox.shrink(),
const SizedBox.shrink(),
2020-09-19 23:56:07 +02:00
tabButton(Icons.search),
tabButton(Icons.person),
],
),
),
),
);
}
2020-08-02 13:34:42 +02:00
}