diff --git a/lib/ui/app/menu_drawer.dart b/lib/ui/app/menu_drawer.dart index 88f0657fd..045b5ebe9 100644 --- a/lib/ui/app/menu_drawer.dart +++ b/lib/ui/app/menu_drawer.dart @@ -3,6 +3,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/ui/app/debug/state_inspector.dart'; +import 'package:invoiceninja_flutter/ui/app/icon_text.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/resources/cached_image.dart'; import 'package:invoiceninja_flutter/utils/pdf.dart'; @@ -220,7 +221,9 @@ class MenuDrawer extends StatelessWidget { ], )), Align( - child: SidebarFooter(), + child: state.prefState.isMenuCollapsed + ? SidebarFooterCollapsed() + : SidebarFooter(), alignment: Alignment(0, 1), ), ], @@ -313,51 +316,6 @@ class SidebarFooter extends StatelessWidget { @override Widget build(BuildContext context) { final state = StoreProvider.of(context).state; - final localization = AppLocalization.of(context); - final ThemeData themeData = Theme.of(context); - final TextStyle aboutTextStyle = themeData.textTheme.body2; - final TextStyle linkStyle = - themeData.textTheme.body2.copyWith(color: themeData.accentColor); - - void showAbout() { - showAboutDialog( - context: context, - applicationName: 'Invoice Ninja', - applicationIcon: Image.asset( - 'assets/images/logo.png', - width: 40.0, - height: 40.0, - ), - applicationVersion: 'Version: $kAppVersion', - applicationLegalese: '© ${DateTime.now().year} Invoice Ninja', - children: [ - Padding( - padding: const EdgeInsets.only(top: 24.0), - child: RichText( - text: TextSpan( - children: [ - TextSpan( - style: aboutTextStyle, - text: localization.thankYouForUsingOurApp + - '\n\n' + - localization.ifYouLikeIt, - ), - _LinkTextSpan( - style: linkStyle, - url: getAppURL(context), - text: ' ' + localization.clickHere + ' ', - ), - TextSpan( - style: aboutTextStyle, - text: localization.toRateIt, - ), - ], - ), - ), - ), - ], - ); - } return Container( color: Theme.of(context).bottomAppBarColor, @@ -376,9 +334,14 @@ class SidebarFooter extends StatelessWidget { icon: Icon(Icons.help_outline), onPressed: () => launch('https://docs.invoiceninja.com'), ), + IconButton( + icon: Icon(Icons.group), + onPressed: () => + launch('https://www.invoiceninja.com/forums/forum/support'), + ), IconButton( icon: Icon(Icons.info_outline), - onPressed: () => showAbout(), + onPressed: () => _showAbout(context), ), if (kDebugMode) IconButton( @@ -430,3 +393,96 @@ class SidebarFooter extends StatelessWidget { ); } } + +class SidebarFooterCollapsed extends StatelessWidget { + @override + Widget build(BuildContext context) { + final localization = AppLocalization.of(context); + return PopupMenuButton( + icon: Icon(Icons.info_outline), + onSelected: (value) { + if (value == localization.about) { + _showAbout(context); + } + }, + itemBuilder: (BuildContext context) => [ + PopupMenuItem( + child: ListTile( + leading: Icon(Icons.mail), + title: Text(localization.contactUs), + ), + value: localization.contactUs, + ), + PopupMenuItem( + child: ListTile( + leading: Icon(Icons.help_outline), + title: Text(localization.documentation), + ), + value: localization.documentation, + ), + PopupMenuItem( + child: ListTile( + leading: Icon(Icons.group), + title: Text(localization.supportForum), + ), + value: localization.supportForum, + ), + PopupMenuItem( + child: ListTile( + leading: Icon(Icons.info_outline), + title: Text(localization.about), + ), + value: localization.about, + ), + ], + ); + } +} + +void _showAbout(BuildContext context) { + + final localization = AppLocalization.of(context); + final ThemeData themeData = Theme.of(context); + final TextStyle aboutTextStyle = themeData.textTheme.body2; + final TextStyle linkStyle = + themeData.textTheme.body2.copyWith(color: themeData.accentColor); + + + showAboutDialog( + context: context, + applicationName: 'Invoice Ninja', + applicationIcon: Image.asset( + 'assets/images/logo.png', + width: 40.0, + height: 40.0, + ), + applicationVersion: 'Version: $kAppVersion', + applicationLegalese: '© ${DateTime.now().year} Invoice Ninja', + children: [ + Padding( + padding: const EdgeInsets.only(top: 24.0), + child: RichText( + text: TextSpan( + children: [ + TextSpan( + style: aboutTextStyle, + text: localization.thankYouForUsingOurApp + + '\n\n' + + localization.ifYouLikeIt, + ), + _LinkTextSpan( + style: linkStyle, + url: getAppURL(context), + text: ' ' + localization.clickHere + ' ', + ), + TextSpan( + style: aboutTextStyle, + text: localization.toRateIt, + ), + ], + ), + ), + ), + ], + ); +} diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index 94d0a0959..aaf5fafba 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -14,6 +14,10 @@ abstract class LocaleCodeAware { mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { + 'support_forum': 'Support Forum', + 'about': 'About', + 'documentation': 'Documentation', + 'contact_us': 'Contact Us', 'subtotal': 'Subtotal', 'line_total': 'Line Total', 'item': 'Item', @@ -15851,6 +15855,15 @@ mixin LocalizationsProvider on LocaleCodeAware { String get subtotal => _localizedValues[localeCode]['subtotal']; + String get contactUs => _localizedValues[localeCode]['contact_us']; + + String get documentation => _localizedValues[localeCode]['documentation']; + + String get about => _localizedValues[localeCode]['about']; + + String get supportForum => _localizedValues[localeCode]['support_forum']; + + String lookup(String key) { final lookupKey = toSnakeCase(key); return _localizedValues[localeCode][lookupKey] ??