From 3d0bfe6c3f4b70c0cf3801c7cb9403acbeaf0233 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Tue, 5 May 2020 18:18:09 +0200 Subject: [PATCH] Add user panel --- lib/ui/routes/main_route/tablet_route.dart | 14 ++++- lib/ui/widgets/safe_state.dart | 10 ++++ .../tablet_mode/current_user_panel.dart | 58 +++++++++++++++++++ 3 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 lib/ui/widgets/tablet_mode/current_user_panel.dart diff --git a/lib/ui/routes/main_route/tablet_route.dart b/lib/ui/routes/main_route/tablet_route.dart index f092834..750432d 100644 --- a/lib/ui/routes/main_route/tablet_route.dart +++ b/lib/ui/routes/main_route/tablet_route.dart @@ -1,4 +1,5 @@ import 'package:comunic/ui/routes/main_route/main_route.dart'; +import 'package:comunic/ui/widgets/tablet_mode/current_user_panel.dart'; import 'package:flutter/material.dart'; /// Main tablet route @@ -32,9 +33,16 @@ class _TabletRouteState extends State { children: [_buildLeftPane(), _buildRightPane()], ); - Widget _buildLeftPane() => Container( - width: 300, - color: Color(0xFF222D32), + Widget _buildLeftPane() => Theme( + data: Theme.of(context).copyWith( + textTheme: TextTheme(body1: TextStyle(color: Colors.white))), + child: Container( + width: 300, + color: Color(0xFF222D32), + child: Column( + children: [CurrentUserPanel()], + ), + ), ); Widget _buildRightPane() => Container(); diff --git a/lib/ui/widgets/safe_state.dart b/lib/ui/widgets/safe_state.dart index e7545a6..e32887b 100644 --- a/lib/ui/widgets/safe_state.dart +++ b/lib/ui/widgets/safe_state.dart @@ -42,4 +42,14 @@ abstract class SafeState extends State { setState(() => onEvent(d)); })); } + + /// Safely mimic the setTimeout javascript function + /// + /// If the widget is unmounted before the end of the timeout, + /// the callback function is not called + void setTimeout(int secs, void Function() cb) { + Timer(Duration(seconds: secs), () { + if (!_unmounted) cb(); + }); + } } diff --git a/lib/ui/widgets/tablet_mode/current_user_panel.dart b/lib/ui/widgets/tablet_mode/current_user_panel.dart new file mode 100644 index 0000000..331f0f0 --- /dev/null +++ b/lib/ui/widgets/tablet_mode/current_user_panel.dart @@ -0,0 +1,58 @@ +import 'package:comunic/helpers/users_helper.dart'; +import 'package:comunic/models/user.dart'; +import 'package:comunic/ui/widgets/account_image_widget.dart'; +import 'package:comunic/ui/widgets/safe_state.dart'; +import 'package:comunic/utils/account_utils.dart'; +import 'package:comunic/utils/ui_utils.dart'; +import 'package:flutter/material.dart'; + +/// Current user panel +/// +/// @author Pierre HUBERT + +class CurrentUserPanel extends StatefulWidget { + @override + _CurrentUserPanelState createState() => _CurrentUserPanelState(); +} + +class _CurrentUserPanelState extends SafeState { + User _user; + + Future _refresh() async { + try { + final user = await UsersHelper().getSingleWithThrow(userID()); + + setState(() => _user = user); + } catch (e, s) { + print("Could not load user panel! $e\n$s"); + + setTimeout(5, _refresh); + } + } + + @override + void initState() { + super.initState(); + _refresh(); + } + + @override + Widget build(BuildContext context) { + return Container( + height: 80, + child: Center(child: _buildContent()), + ); + } + + Widget _buildContent() { + if (_user == null) return buildCenteredProgressBar(); + + return ListTile( + leading: AccountImageWidget( + user: _user, + width: 50, + ), + title: Text(_user.displayName), + ); + } +}