import 'dart:async'; import 'package:flutter/material.dart'; import 'package:mobdr/main.dart'; import 'package:mobdr/ui/account/tab_account.dart'; import 'package:mobdr/ui/home/tab_home.dart'; import 'package:mobdr/ui/mp4/tab_mp4.dart'; import 'package:mobdr/ui/sync/tab_synchro.dart'; import 'package:mobdr/config/constant.dart'; import 'package:mobdr/events.dart'; import 'package:mobdr/service/plausible.dart'; import 'package:mobdr/service/logger_util.dart'; import 'package:mobdr/cubit/language/app_localizations.dart'; class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePageState(); } class _HomePageState extends State with SingleTickerProviderStateMixin { late PageController _pageController; late StreamSubscription subUrlEvent; late StreamSubscription subSynchronizationEvent; bool _isSyncing = false; int _currentIndex = 0; List _contentPages = []; @override void initState() { _contentPages = [ TabHomePage(navigateToTab: navigateToTab), SynchronizationPage(), TabMP4Page(), TabAccountPage(), ]; // set initial pages for navigation to home page _pageController = PageController(initialPage: 0); _pageController.addListener(_handleTabSelection); // Listen Url event subUrlEvent = eventBus.on().listen((e) { setState(() { _currentIndex = 2; _pageController.jumpToPage(_currentIndex); FocusScope.of(context).unfocus(); }); }); // Listen Synchronization Event subSynchronizationEvent = eventBus.on().listen((e) { _isSyncing = e.isRunning; }); // check if plausible is up and running doAsyncPlausibleCheck().then((_) { PlausibleUtil.addEventAsync(name: 'pageview', page: 'tab_home'); }); super.initState(); } Future doAsyncPlausibleCheck() async { await PlausibleUtil.checkPlausibleUp(); } void _handleTabSelection() { /* setState(() { }); */ } void navigateToTab(int tabIndex) { setState(() { _currentIndex = tabIndex; _pageController.jumpToPage(tabIndex); FocusScope.of(context).unfocus(); }); } @override void dispose() { subUrlEvent.cancel(); subSynchronizationEvent.cancel(); _pageController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( body: PageView( controller: _pageController, physics: NeverScrollableScrollPhysics(), children: _contentPages.map((Widget content) { return content; }).toList(), ), bottomNavigationBar: BottomNavigationBar( type: BottomNavigationBarType.fixed, currentIndex: _currentIndex, onTap: (value) { if (!_isSyncing) { setState(() { _currentIndex = value; _pageController.jumpToPage(value); FocusScope.of(context).unfocus(); }); // analytics _trackPageView(value); } }, selectedFontSize: 8, unselectedFontSize: 8, iconSize: 28, selectedItemColor: Colors.blue, // Couleur de l'icône de l'onglet sélectionné unselectedItemColor: CHARCOAL, // Couleur de l'icône des onglets non sélectionnés selectedLabelStyle: TextStyle( color: Colors.blue, // Couleur du texte de l'onglet sélectionné fontWeight: FontWeight.bold, ), unselectedLabelStyle: TextStyle( color: CHARCOAL, // Couleur du texte des onglets non sélectionnés fontWeight: FontWeight.bold, ), items: [ BottomNavigationBarItem( label: 'Home', icon: Icon(Icons.home), ), BottomNavigationBarItem( label: 'Synchro', icon: Icon(Icons.sync), ), BottomNavigationBarItem( label: 'MP4', icon: Icon(Icons.web), ), BottomNavigationBarItem( label: AppLocalizations.of(context)!.translate('i18n_menu_account'), icon: Icon(Icons.person_outline), ), ], ), ); } void _trackPageView(int index) { String page = ''; switch (index) { case 0: page = 'tab_home'; break; case 1: page = 'tab_synchro'; break; case 2: page = 'tab_mp4'; break; case 3: page = 'tab_account'; break; } LoggerUtil.dblog('LOG', 'MOBDR', 'Page : ${page}', 0); PlausibleUtil.addEventAsync(name: 'pageview', page: page); } }