aboutsummaryrefslogtreecommitdiff
path: root/lib/views/main_view.dart
diff options
context:
space:
mode:
Diffstat (limited to 'lib/views/main_view.dart')
-rw-r--r--lib/views/main_view.dart141
1 files changed, 141 insertions, 0 deletions
diff --git a/lib/views/main_view.dart b/lib/views/main_view.dart
new file mode 100644
index 0000000..678db4a
--- /dev/null
+++ b/lib/views/main_view.dart
@@ -0,0 +1,141 @@
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+
+import 'package:kulinar_app/constants.dart';
+import 'package:kulinar_app/views/file_info.dart';
+import 'package:kulinar_app/views/recipe_view.dart';
+import 'package:kulinar_app/models/recipe_class.dart';
+import 'package:kulinar_app/widgets/error_widgets.dart';
+import 'package:kulinar_app/widgets/toastbar_widget.dart';
+import 'package:kulinar_app/widgets/recipe_card_widget.dart';
+import 'package:kulinar_app/widgets/custom_drawer_widget.dart';
+import 'package:kulinar_app/models/data/recipe_data_class.dart';
+import 'package:kulinar_app/widgets/recipe_search_delegate.dart';
+import 'package:kulinar_app/widgets/page_route_transitions.dart';
+
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+
+class MainView extends StatefulWidget {
+ const MainView({Key? key}) : super(key: key);
+
+ @override
+ _MainViewState createState() => _MainViewState();
+}
+
+class _MainViewState extends State<MainView> with SingleTickerProviderStateMixin, WidgetsBindingObserver {
+ static const platform = const MethodChannel("com.davidpenkowoj.kulinar.openfile");
+
+ TabController? _tabController;
+ BuildContext? _toastyContext;
+
+ @override
+ void initState() {
+ super.initState();
+ getOpenFileUrl();
+ WidgetsBinding.instance.addObserver(this);
+ _tabController = TabController(length: 2, vsync: this);
+ }
+
+ @override
+ void dispose() {
+ super.dispose();
+ _tabController!.dispose();
+ WidgetsBinding.instance.removeObserver(this);
+ }
+
+ @override
+ void didChangeAppLifecycleState(AppLifecycleState state) {
+ if (state == AppLifecycleState.resumed) {
+ getOpenFileUrl();
+ }
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: _buildAppBar(context, _tabController!),
+ drawer: CustomDrawer(initalIndex: 0),
+ floatingActionButton: _buildFloatingActionButton(),
+ body: Builder(builder: (BuildContext context) {
+ _toastyContext = context;
+
+ return TabBarView(
+ controller: _tabController,
+ children: [
+ _buildListView(RecipeData.recipeList.where((element) => element.rating > 0).toList()),
+ _buildListView(RecipeData.recipeList.where((element) => element.rating == 0).toList()),
+ ],
+ );
+ }),
+ );
+ }
+
+ void getOpenFileUrl() async {
+ dynamic url = await platform.invokeMethod("getOpenFileUrl");
+
+ if (url != null) {
+ setState(() {
+ Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (BuildContext context) => FileInfo(filePath: url)), (_) => false);
+ });
+ }
+ }
+
+ void showToastCallback(String content, String actionLabel, Function actionCallback) {
+ ToastBar.showToastBar(_toastyContext!, content, actionLabel: actionLabel, actionCallback: actionCallback);
+ }
+
+ Widget _buildFloatingActionButton() {
+ return FloatingActionButton(
+ child: Icon(Icons.add, color: cIconColor),
+ onPressed: () async {
+ await Navigator.push(
+ context,
+ SlideFromBottomRoute(child: RecipeView(readonly: false)),
+ );
+
+ setState(() {});
+ },
+ );
+ }
+
+ Widget _buildListView(List<Recipe> filteredRecipeList) {
+ if (filteredRecipeList.isEmpty) return NoContentError();
+
+ return ListView.builder(
+ itemCount: filteredRecipeList.length,
+ itemBuilder: (context, index) => RecipeCard(recipe: filteredRecipeList[index], redrawCallback: redrawMainView, showToastCallback: showToastCallback),
+ );
+ }
+
+ PreferredSizeWidget _buildAppBar(BuildContext context, TabController tabController) {
+ return AppBar(
+ title: Text(AppLocalizations.of(context)!.category1),
+ actions: [
+ IconButton(
+ icon: Icon(
+ Icons.search,
+ ),
+ onPressed: () async {
+ await showSearch(
+ context: context,
+ delegate: RecipeSearch(),
+ );
+
+ setState(() {});
+ },
+ ),
+ ],
+ bottom: TabBar(
+ controller: tabController,
+ tabs: [
+ Tab(child: Text(AppLocalizations.of(context)!.category2, style: cSubTitleStyle)),
+ Tab(child: Text(AppLocalizations.of(context)!.category3, style: cSubTitleStyle)),
+ ],
+ ),
+ );
+ }
+
+ Future<void> redrawMainView() async {
+ setState(() {});
+ }
+}