import 'package:fbla_ui/pages/businesses_overview.dart'; import 'package:fbla_ui/pages/create_edit_business.dart'; import 'package:fbla_ui/pages/create_edit_listing.dart'; import 'package:fbla_ui/pages/listings_overview.dart'; import 'package:fbla_ui/shared/api_logic.dart'; import 'package:fbla_ui/shared/global_vars.dart'; import 'package:fbla_ui/shared/utils.dart'; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; class Home extends StatefulWidget { final void Function() themeCallback; final int? initialPage; const Home({super.key, required this.themeCallback, this.initialPage}); @override State createState() => _HomeState(); } class _HomeState extends State { Set jobTypeFilters = {}; Set offerTypeFilters = {}; Set businessTypeFilters = {}; String searchQuery = ''; late Future refreshBusinessDataOverviewJobFuture; late Future refreshBusinessDataOverviewBusinessFuture; int currentPageIndex = 0; late dynamic previousJobData; ScrollController scrollControllerBusinesses = ScrollController(); ScrollController scrollControllerJobs = ScrollController(); void _updateLoggedIn(bool updated) { setState(() { loggedIn = updated; }); } @override void initState() { super.initState(); currentPageIndex = widget.initialPage ?? 0; initialLogin(); refreshBusinessDataOverviewJobFuture = fetchBusinessDataOverviewJobs(); refreshBusinessDataOverviewBusinessFuture = fetchBusinessDataOverviewTypes(); } Future initialLogin() async { final prefs = await SharedPreferences.getInstance(); bool? rememberMe = prefs.getBool('rememberMe'); if (rememberMe != null && rememberMe) { String? username = prefs.getString('username'); String? password = prefs.getString('password'); jwt = await signIn(username!, password!); if (!jwt.contains('Error:')) { setState(() { loggedIn = true; }); } } } Future _updateOverviewBusinessesJobsCallback( Set? newJobTypeFilters, Set? newOfferTypeFilters) async { if (newJobTypeFilters != null) { jobTypeFilters = Set.from(newJobTypeFilters); } if (newOfferTypeFilters != null) { offerTypeFilters = Set.from(newOfferTypeFilters); } var refreshedData = fetchBusinessDataOverviewJobs( typeFilters: jobTypeFilters, offerFilters: offerTypeFilters); await refreshedData; setState(() { refreshBusinessDataOverviewJobFuture = refreshedData; }); } Future _updateOverviewBusinessesBusinessCallback( Set? newFilters) async { if (newFilters != null) { businessTypeFilters = Set.from(newFilters); } var refreshedData = fetchBusinessDataOverviewTypes( typeFilters: businessTypeFilters.toList()); await refreshedData; setState(() { refreshBusinessDataOverviewBusinessFuture = refreshedData; }); } @override Widget build(BuildContext context) { bool widescreen = MediaQuery.sizeOf(context).width >= widescreenWidth; return Scaffold( // floatingActionButton: _getFAB(widescreen, scrollControllerBusinesses, // scrollControllerJobs, currentPageIndex), bottomNavigationBar: _getNavigationBar(widescreen), body: RefreshIndicator( edgeOffset: 145, onRefresh: () async { _updateOverviewBusinessesJobsCallback(null, null); _updateOverviewBusinessesBusinessCallback(null); }, child: widescreen ? Row( children: [ _getNavigationRail(), Expanded( child: _ContentPane( themeCallback: widget.themeCallback, searchQuery: searchQuery, currentPageIndex: currentPageIndex, refreshBusinessDataOverviewBusinessFuture: refreshBusinessDataOverviewBusinessFuture, refreshBusinessDataOverviewJobFuture: refreshBusinessDataOverviewJobFuture, updateOverviewBusinessesBusinessCallback: _updateOverviewBusinessesBusinessCallback, updateOverviewBusinessesJobsCallback: _updateOverviewBusinessesJobsCallback, updateLoggedIn: _updateLoggedIn, ), ) ], ) : _ContentPane( themeCallback: widget.themeCallback, searchQuery: searchQuery, currentPageIndex: currentPageIndex, refreshBusinessDataOverviewBusinessFuture: refreshBusinessDataOverviewBusinessFuture, refreshBusinessDataOverviewJobFuture: refreshBusinessDataOverviewJobFuture, updateOverviewBusinessesBusinessCallback: _updateOverviewBusinessesBusinessCallback, updateOverviewBusinessesJobsCallback: _updateOverviewBusinessesJobsCallback, updateLoggedIn: _updateLoggedIn, ), ), ); } Widget? _getNavigationBar(bool widescreen) { if (!widescreen) { return NavigationBar( selectedIndex: currentPageIndex, indicatorColor: Theme.of(context).colorScheme.primary.withOpacity(0.5), onDestinationSelected: (int index) { setState(() { currentPageIndex = index; }); }, destinations: [ NavigationDestination( icon: const Icon(Icons.business_outlined), selectedIcon: Icon( Icons.business, color: Theme.of(context).colorScheme.onSurface, ), label: 'Businesses'), NavigationDestination( icon: const Icon(Icons.work_outline), selectedIcon: Icon( Icons.work, color: Theme.of(context).colorScheme.onSurface, ), label: 'Job Listings'), // NavigationDestination( // icon: const Icon(Icons.description_outlined), // selectedIcon: Icon( // Icons.description, // color: Theme.of(context).colorScheme.onSurface, // ), // label: 'Export Data') ], ); } return null; } Widget _getNavigationRail() { return Row( children: [ NavigationRail( selectedIndex: currentPageIndex, indicatorColor: Theme.of(context).colorScheme.primary.withOpacity(0.5), trailing: Expanded( child: Align( alignment: Alignment.bottomCenter, child: Padding( padding: const EdgeInsets.all(16), child: IconButton( iconSize: 30, icon: Icon( getIconFromThemeMode(themeMode), ), onPressed: () { setState(() { widget.themeCallback(); }); }, ), ), ), ), leading: Column( children: [ Padding( padding: const EdgeInsets.only(top: 2.0, bottom: 8.0), child: Image.asset( 'assets/Triangle256.png', height: 50, ), ), if (loggedIn) FloatingActionButton( heroTag: 'Homepage', onPressed: () { if (currentPageIndex == 0) { Navigator.push( context, MaterialPageRoute( builder: (context) => const CreateEditBusiness())); } else if (currentPageIndex == 1) { Navigator.push( context, MaterialPageRoute( builder: (context) => const CreateEditJobListing())); } }, child: const Icon(Icons.add), ) ], ), onDestinationSelected: (int index) { setState(() { currentPageIndex = index; }); }, labelType: NavigationRailLabelType.all, destinations: [ NavigationRailDestination( icon: const Icon(Icons.business_outlined), selectedIcon: Icon( Icons.business, color: Theme.of(context).colorScheme.onSurface, ), label: const Text('Businesses')), NavigationRailDestination( icon: const Icon(Icons.work_outline), selectedIcon: Icon( Icons.work, color: Theme.of(context).colorScheme.onSurface, ), label: const Text('Job Listings')), // NavigationRailDestination( // icon: const Icon(Icons.description_outlined), // selectedIcon: Icon( // Icons.description, // color: Theme.of(context).colorScheme.onSurface, // ), // label: const Text('Export Data')) ], ), // children.first ], ); // } // return children.first; } // Widget _contentPane() { // return IndexedStack( // index: currentPageIndex, // children: [ // BusinessesOverview( // searchQuery: searchQuery, // refreshBusinessDataOverviewFuture: // refreshBusinessDataOverviewBusinessFuture, // updateBusinessesCallback: _updateOverviewBusinessesBusinessCallback, // themeCallback: widget.themeCallback, // updateLoggedIn: _updateLoggedIn, // ), // JobsOverview( // searchQuery: searchQuery, // refreshJobDataOverviewFuture: refreshBusinessDataOverviewJobFuture, // updateBusinessesCallback: _updateOverviewBusinessesJobsCallback, // themeCallback: widget.themeCallback, updateLoggedIn: _updateLoggedIn), // ExportData( // searchQuery: searchQuery, // refreshBusinessDataOverviewFuture: // refreshBusinessDataOverviewBusinessFuture, // updateBusinessesWithJobCallback: // _updateOverviewBusinessesJobsCallback, // themeCallback: widget.themeCallback, // refreshJobDataOverviewFuture: refreshBusinessDataOverviewJobFuture, // updateBusinessesCallback: _updateOverviewBusinessesBusinessCallback) // ], // ); // } } class _ContentPane extends StatelessWidget { final String searchQuery; final Future refreshBusinessDataOverviewBusinessFuture; final Future Function(Set) updateOverviewBusinessesBusinessCallback; final void Function() themeCallback; final Future refreshBusinessDataOverviewJobFuture; final Future Function(Set?, Set?) updateOverviewBusinessesJobsCallback; final int currentPageIndex; final void Function(bool) updateLoggedIn; const _ContentPane({ required this.searchQuery, required this.refreshBusinessDataOverviewBusinessFuture, required this.updateOverviewBusinessesBusinessCallback, required this.themeCallback, required this.refreshBusinessDataOverviewJobFuture, required this.updateOverviewBusinessesJobsCallback, required this.currentPageIndex, required this.updateLoggedIn, }); @override Widget build(BuildContext context) { return IndexedStack( index: currentPageIndex, children: [ BusinessesOverview( searchQuery: searchQuery, refreshBusinessDataOverviewFuture: refreshBusinessDataOverviewBusinessFuture, updateBusinessesCallback: updateOverviewBusinessesBusinessCallback, themeCallback: themeCallback, updateLoggedIn: updateLoggedIn, ), JobsOverview( searchQuery: searchQuery, refreshJobDataOverviewFuture: refreshBusinessDataOverviewJobFuture, updateBusinessesCallback: updateOverviewBusinessesJobsCallback, themeCallback: themeCallback, updateLoggedIn: updateLoggedIn, ), // ExportData( // searchQuery: searchQuery, // refreshBusinessDataOverviewFuture: // refreshBusinessDataOverviewBusinessFuture, // updateBusinessesWithJobCallback: // updateOverviewBusinessesJobsCallback, // themeCallback: themeCallback, // refreshJobDataOverviewFuture: refreshBusinessDataOverviewJobFuture, // updateBusinessesCallback: updateOverviewBusinessesBusinessCallback) ], ); } } // class FABAnimator extends FloatingActionButtonAnimator { // @override // Offset getOffset({Offset begin, Offset end, double progress}) { // return end; // } // // @override // Animation getRotationAnimation({required Animation parent}) { // return Tween(begin: 0.0, end: 1.0).animate(parent); // throw UnimplementedError(); // } // // @override // Animation getScaleAnimation({required Animation parent}) { // return Tween(begin: 0.0, end: 1.0).animate(parent); // throw UnimplementedError(); // } // }