164 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:flutter/material.dart';
 | |
| import 'package:flutter_hbb/mobile/pages/server_page.dart';
 | |
| import 'package:flutter_hbb/mobile/pages/settings_page.dart';
 | |
| import 'package:get/get.dart';
 | |
| import '../../common.dart';
 | |
| import '../../common/widgets/chat_page.dart';
 | |
| import 'connection_page.dart';
 | |
| 
 | |
| abstract class PageShape extends Widget {
 | |
|   final String title = "";
 | |
|   final Widget icon = Icon(null);
 | |
|   final List<Widget> appBarActions = [];
 | |
| }
 | |
| 
 | |
| class HomePage extends StatefulWidget {
 | |
|   static final homeKey = GlobalKey<_HomePageState>();
 | |
| 
 | |
|   HomePage() : super(key: homeKey);
 | |
| 
 | |
|   @override
 | |
|   _HomePageState createState() => _HomePageState();
 | |
| }
 | |
| 
 | |
| class _HomePageState extends State<HomePage> {
 | |
|   var _selectedIndex = 0;
 | |
|   int get selectedIndex => _selectedIndex;
 | |
|   final List<PageShape> _pages = [];
 | |
|   bool get isChatPageCurrentTab => isAndroid
 | |
|       ? _selectedIndex == 1
 | |
|       : false; // change this when ios have chat page
 | |
| 
 | |
|   void refreshPages() {
 | |
|     setState(() {
 | |
|       initPages();
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void initState() {
 | |
|     super.initState();
 | |
|     initPages();
 | |
|   }
 | |
| 
 | |
|   void initPages() {
 | |
|     _pages.clear();
 | |
|     _pages.add(ConnectionPage());
 | |
|     if (isAndroid) {
 | |
|       _pages.addAll([ChatPage(type: ChatPageType.mobileMain), ServerPage()]);
 | |
|     }
 | |
|     _pages.add(SettingsPage());
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return WillPopScope(
 | |
|         onWillPop: () async {
 | |
|           if (_selectedIndex != 0) {
 | |
|             setState(() {
 | |
|               _selectedIndex = 0;
 | |
|             });
 | |
|           } else {
 | |
|             return true;
 | |
|           }
 | |
|           return false;
 | |
|         },
 | |
|         child: Scaffold(
 | |
|           // backgroundColor: MyTheme.grayBg,
 | |
|           appBar: AppBar(
 | |
|             centerTitle: true,
 | |
|             title: appTitle(),
 | |
|             actions: _pages.elementAt(_selectedIndex).appBarActions,
 | |
|           ),
 | |
|           bottomNavigationBar: BottomNavigationBar(
 | |
|             key: navigationBarKey,
 | |
|             items: _pages
 | |
|                 .map((page) =>
 | |
|                     BottomNavigationBarItem(icon: page.icon, label: page.title))
 | |
|                 .toList(),
 | |
|             currentIndex: _selectedIndex,
 | |
|             type: BottomNavigationBarType.fixed,
 | |
|             selectedItemColor: MyTheme.accent, //
 | |
|             unselectedItemColor: MyTheme.darkGray,
 | |
|             onTap: (index) => setState(() {
 | |
|               // close chat overlay when go chat page
 | |
|               if (_selectedIndex != index) {
 | |
|                 _selectedIndex = index;
 | |
|                 if (isChatPageCurrentTab) {
 | |
|                   gFFI.chatModel.hideChatIconOverlay();
 | |
|                   gFFI.chatModel.hideChatWindowOverlay();
 | |
|                   gFFI.chatModel.mobileClearClientUnread(
 | |
|                       gFFI.chatModel.currentKey.connId);
 | |
|                 }
 | |
|               }
 | |
|             }),
 | |
|           ),
 | |
|           body: _pages.elementAt(_selectedIndex),
 | |
|         ));
 | |
|   }
 | |
| 
 | |
|   Widget appTitle() {
 | |
|     final currentUser = gFFI.chatModel.currentUser;
 | |
|     final currentKey = gFFI.chatModel.currentKey;
 | |
|     if (isChatPageCurrentTab &&
 | |
|         currentUser != null &&
 | |
|         currentKey.peerId.isNotEmpty) {
 | |
|       final connected =
 | |
|           gFFI.serverModel.clients.any((e) => e.id == currentKey.connId);
 | |
|       return Row(
 | |
|         mainAxisAlignment: MainAxisAlignment.center,
 | |
|         children: [
 | |
|           Tooltip(
 | |
|             message: currentKey.isOut
 | |
|                 ? translate('Outgoing connection')
 | |
|                 : translate('Incoming connection'),
 | |
|             child: Icon(
 | |
|               currentKey.isOut
 | |
|                   ? Icons.call_made_rounded
 | |
|                   : Icons.call_received_rounded,
 | |
|             ),
 | |
|           ),
 | |
|           Expanded(
 | |
|             child: Center(
 | |
|               child: Row(
 | |
|                 mainAxisAlignment: MainAxisAlignment.center,
 | |
|                 children: [
 | |
|                   Text(
 | |
|                     "${currentUser.firstName}   ${currentUser.id}",
 | |
|                   ),
 | |
|                   if (connected)
 | |
|                     Container(
 | |
|                       width: 10,
 | |
|                       height: 10,
 | |
|                       decoration: BoxDecoration(
 | |
|                           shape: BoxShape.circle,
 | |
|                           color: Color.fromARGB(255, 133, 246, 199)),
 | |
|                     ).marginSymmetric(horizontal: 2),
 | |
|                 ],
 | |
|               ),
 | |
|             ),
 | |
|           ),
 | |
|         ],
 | |
|       );
 | |
|     }
 | |
|     return Text("RustDesk");
 | |
|   }
 | |
| }
 | |
| 
 | |
| class WebHomePage extends StatelessWidget {
 | |
|   final connectionPage = ConnectionPage();
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     return Scaffold(
 | |
|       // backgroundColor: MyTheme.grayBg,
 | |
|       appBar: AppBar(
 | |
|         centerTitle: true,
 | |
|         title: Text("RustDesk" + (isWeb ? " (Beta) " : "")),
 | |
|         actions: connectionPage.appBarActions,
 | |
|       ),
 | |
|       body: connectionPage,
 | |
|     );
 | |
|   }
 | |
| }
 |