From 239a505be46db43169e731a33bc8f2a91700b86c Mon Sep 17 00:00:00 2001 From: Sun Date: Mon, 26 Apr 2021 15:47:45 +0800 Subject: [PATCH] change display services style --- assets/logo/logo_assistant.png | Bin 0 -> 5801 bytes assets/logo/logo_esse.jpg | Bin 3055 -> 0 bytes assets/logo/logo_files.png | Bin 0 -> 13743 bytes lib/apps/assistant/page.dart | 18 +- lib/apps/chat/list.dart | 9 +- lib/apps/chat/provider.dart | 2 + lib/apps/file/page.dart | 9 +- lib/apps/service/list.dart | 89 ++++++--- lib/apps/service/models.dart | 52 ++++++ lib/l10n/localizations.dart | 8 +- lib/l10n/localizations_en.dart | 14 +- lib/l10n/localizations_zh.dart | 14 +- lib/pages/home.dart | 287 +++++++++++------------------ lib/provider.dart | 27 ++- lib/widgets/default_home_show.dart | 57 ++++++ pubspec.yaml | 3 +- src/apps/chat/models.rs | 4 +- 17 files changed, 351 insertions(+), 242 deletions(-) create mode 100644 assets/logo/logo_assistant.png delete mode 100644 assets/logo/logo_esse.jpg create mode 100644 assets/logo/logo_files.png create mode 100644 lib/widgets/default_home_show.dart diff --git a/assets/logo/logo_assistant.png b/assets/logo/logo_assistant.png new file mode 100644 index 0000000000000000000000000000000000000000..ad14f2f8a006439596b4bdc15ca0072e7b4bcc59 GIT binary patch literal 5801 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 _AssistantPageState(); + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: AssistantDetail(), + )); + } +} + +class AssistantDetail extends StatefulWidget { + const AssistantDetail({Key key}) : super(key: key); + + @override + _AssistantDetailState createState() => _AssistantDetailState(); } -class _AssistantPageState extends State { +class _AssistantDetailState extends State { TextEditingController textController = TextEditingController(); FocusNode textFocus = FocusNode(); bool emojiShow = false; diff --git a/lib/apps/chat/list.dart b/lib/apps/chat/list.dart index 6faac3a..9bcdc26 100644 --- a/lib/apps/chat/list.dart +++ b/lib/apps/chat/list.dart @@ -23,11 +23,10 @@ class _ChatListState extends State { final friends = provider.friends; final chatKeys = provider.orderKeys; - return Expanded( - child: ListView.builder( - itemCount: chatKeys.length, - itemBuilder: (BuildContext ctx, int index) => ListChat(friend: friends[chatKeys[index]]), - )); + return ListView.builder( + itemCount: chatKeys.length, + itemBuilder: (BuildContext ctx, int index) => ListChat(friend: friends[chatKeys[index]]), + ); } } diff --git a/lib/apps/chat/provider.dart b/lib/apps/chat/provider.dart index af279a4..9c4141d 100644 --- a/lib/apps/chat/provider.dart +++ b/lib/apps/chat/provider.dart @@ -58,6 +58,7 @@ class ChatProvider extends ChangeNotifier { this.orderKeys.clear(); this.requests.clear(); this.activedMessages.clear(); + this.topKeys.clear(); } updateActived() { @@ -65,6 +66,7 @@ class ChatProvider extends ChangeNotifier { // load friends. rpc.send('chat-friend-list', []); + notifyListeners(); } updateActivedFriend(int id) { diff --git a/lib/apps/file/page.dart b/lib/apps/file/page.dart index 1ab25e5..e06e839 100644 --- a/lib/apps/file/page.dart +++ b/lib/apps/file/page.dart @@ -84,11 +84,10 @@ class _FolderListState extends State { final color = Theme.of(context).colorScheme; final isDesktop = isDisplayDesktop(context); - return Expanded( - child: ListView.builder( - itemCount: FILE_DIRECTORY.length, - itemBuilder: (BuildContext ctx, int index) => item(index, color, isDesktop), - )); + return ListView.builder( + itemCount: FILE_DIRECTORY.length, + itemBuilder: (BuildContext ctx, int index) => item(index, color, isDesktop), + ); } } diff --git a/lib/apps/service/list.dart b/lib/apps/service/list.dart index adffcb4..dc5aa88 100644 --- a/lib/apps/service/list.dart +++ b/lib/apps/service/list.dart @@ -5,8 +5,16 @@ import 'package:esse/utils/adaptive.dart'; import 'package:esse/l10n/localizations.dart'; import 'package:esse/provider.dart'; +import 'package:esse/apps/service/models.dart'; import 'package:esse/apps/assistant/page.dart'; import 'package:esse/apps/assistant/provider.dart'; +import 'package:esse/apps/assistant/models.dart'; +import 'package:esse/apps/file/page.dart'; + +const List INNER_SERVICES = [ + InnerService.Files, + InnerService.Assistant, +]; class ServiceList extends StatefulWidget { const ServiceList({Key key}) : super(key: key); @@ -18,34 +26,60 @@ class ServiceList extends StatefulWidget { class _ServiceListState extends State { @override Widget build(BuildContext context) { - final serviceKeys = [1]; - final services = {}; + final lang = AppLocalizations.of(context); + final isDesktop = isDisplayDesktop(context); - return Expanded( - child: ListView.builder( - itemCount: serviceKeys.length, - itemBuilder: (BuildContext ctx, int index) => _ListService(), - )); + return Column( + children: [ + Column( + children: INNER_SERVICES.map((v) { + final params = v.params(lang); + return ListInnerService( + name: params[0], + bio: params[1], + logo: params[2], + callback: () => v.callback(context, isDesktop, lang), + isDesktop: isDesktop, + ); + }).toList() + ), + // Expanded( + // child: ListView.builder( + // itemCount: serviceKeys.length, + // itemBuilder: (BuildContext ctx, int index) => _ListService(), + // )), + ] + ); } } -class _ListService extends StatelessWidget { - const _ListService({Key key}) : super(key: key); +class ListInnerService extends StatelessWidget { + final String name; + final String bio; + final String logo; + final Function callback; + final bool isDesktop; + + const ListInnerService({Key key, + this.name, this.bio, this.logo, this.callback, this.isDesktop + }) : super(key: key); @override Widget build(BuildContext context) { - final color = Theme.of(context).colorScheme; - final lang = AppLocalizations.of(context); - final isDesktop = isDisplayDesktop(context); - return GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { - final widget = AssistantPage(); - if (isDesktop) { - Provider.of(context, listen: false).updateActivedApp(widget); - } else { - Navigator.push(context, MaterialPageRoute(builder: (_) => widget)); + final widgets = this.callback(); + if (widgets != null) { + if (this.isDesktop) { + Provider.of(context, listen: false).updateActivedApp(widgets[0], widgets[1], widgets[2]); + } else { + if (widgets[2] != null) { + Provider.of(context, listen: false).updateActivedApp(null, widgets[1], widgets[2]); + } else { + Navigator.push(context, MaterialPageRoute(builder: (_) => widgets[0])); + } + } } }, child: Container( @@ -55,16 +89,16 @@ class _ListService extends StatelessWidget { Container( width: 45.0, height: 45.0, + padding: EdgeInsets.all(6.0), margin: const EdgeInsets.only(left: 20.0, right: 15.0), decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage('assets/logo/logo_esse.jpg'), - fit: BoxFit.cover, - ), - borderRadius: BorderRadius.circular(15.0) + borderRadius: BorderRadius.circular(15.0), ), + child: Image.asset(this.logo), ), - Expanded( + this.bio == null + ? Text(this.name, style: TextStyle(fontSize: 16.0)) + : Expanded( child: Container( height: 55.0, child: Column( @@ -72,15 +106,12 @@ class _ListService extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( - child: Text('Jarvis', - maxLines: 1, + child: Text(this.name, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 16.0)) ), - SizedBox(height: 5.0), Expanded( - child: Text(lang.robotJarvis, - maxLines: 1, + child: Text(this.bio, maxLines: 1, overflow: TextOverflow.ellipsis, style: const TextStyle(color: Color(0xFFADB0BB), fontSize: 12.0)), ), diff --git a/lib/apps/service/models.dart b/lib/apps/service/models.dart index e69de29..e945e87 100644 --- a/lib/apps/service/models.dart +++ b/lib/apps/service/models.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'package:esse/l10n/localizations.dart'; +import 'package:esse/provider.dart'; + +import 'package:esse/apps/assistant/page.dart'; +import 'package:esse/apps/file/page.dart'; + +enum InnerService { + Files, + Assistant, +} + +extension InnerServiceExtension on InnerService { + List params(AppLocalizations lang) { + switch (this) { + case InnerService.Files: + return [lang.files, lang.filesBio, 'assets/logo/logo_files.png']; + case InnerService.Assistant: + return [lang.assistant, lang.assistantBio, 'assets/logo/logo_assistant.png']; + } + } + + void callback(context, isDesktop, lang) { + Widget coreWidget = null; + String listTitle = null; + Widget listHome = null; + + if (isDesktop) { + switch (this) { + case InnerService.Files: + listTitle = lang.files; + listHome = FolderList(); + break; + case InnerService.Assistant: + coreWidget = AssistantDetail(); + break; + } + Provider.of(context, listen: false).updateActivedApp(coreWidget, listTitle, listHome); + } else { + switch (this) { + case InnerService.Files: + Provider.of(context, listen: false).updateActivedApp(null, lang.files, FolderList()); + break; + case InnerService.Assistant: + Navigator.push(context, MaterialPageRoute(builder: (_) => AssistantPage())); + break; + } + } + } +} diff --git a/lib/l10n/localizations.dart b/lib/l10n/localizations.dart index 05d8705..933f15a 100644 --- a/lib/l10n/localizations.dart +++ b/lib/l10n/localizations.dart @@ -77,7 +77,6 @@ abstract class AppLocalizations { String get delete; String get open; String get unknown; - String get robotJarvis; // theme String get themeDark; @@ -106,7 +105,6 @@ abstract class AppLocalizations { String get addGroup; String get chats; String get groups; - String get files; String get devices; String get nightly; String get scan; @@ -155,6 +153,12 @@ abstract class AppLocalizations { String get donate; String get website; String get email; + + // services + String get files; + String get filesBio; + String get assistant; + String get assistantBio; } class _AppLocalizationsDelegate diff --git a/lib/l10n/localizations_en.dart b/lib/l10n/localizations_en.dart index 9ae8aa4..a8500a8 100644 --- a/lib/l10n/localizations_en.dart +++ b/lib/l10n/localizations_en.dart @@ -78,8 +78,6 @@ class AppLocalizationsEn extends AppLocalizations { String get open => 'Open'; @override String get unknown => 'Unknown'; - @override - String get robotJarvis => 'Jarvis is a robot, only belongs to you.'; // theme @override @@ -129,8 +127,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get groups => 'Services'; @override - String get files => 'Files'; - @override String get devices => 'Devices'; @override String get nightly => 'Night Mode'; @@ -222,4 +218,14 @@ class AppLocalizationsEn extends AppLocalizations { String get website => 'Website'; @override String get email => 'Email'; + + // services + @override + String get files => 'Files'; + @override + String get filesBio => 'Sync & manager files between devices'; + @override + String get assistant => 'Jarvis'; + @override + String get assistantBio => 'Jarvis is a robot, only belongs to you.'; } diff --git a/lib/l10n/localizations_zh.dart b/lib/l10n/localizations_zh.dart index 380cd36..6770547 100644 --- a/lib/l10n/localizations_zh.dart +++ b/lib/l10n/localizations_zh.dart @@ -78,8 +78,6 @@ class AppLocalizationsZh extends AppLocalizations { String get open => '打开'; @override String get unknown => '未知'; - @override - String get robotJarvis => 'Jarvis 是个机器人,只属于你。'; // theme @override @@ -129,8 +127,6 @@ class AppLocalizationsZh extends AppLocalizations { @override String get groups => '服务列表'; @override - String get files => '文件管理'; - @override String get devices => '关联设备'; @override String get nightly => '夜间模式'; @@ -222,4 +218,14 @@ class AppLocalizationsZh extends AppLocalizations { String get website => '官网'; @override String get email => '联系邮件'; + + // services + @override + String get files => '文件管理'; + @override + String get filesBio => '同步和管理各设备上的文件'; + @override + String get assistant => 'Jarvis'; + @override + String get assistantBio => 'Jarvis 是个机器人,只属于你。'; } diff --git a/lib/pages/home.dart b/lib/pages/home.dart index ff3ab78..4c53482 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -31,6 +31,7 @@ import 'package:esse/apps/chat/add.dart'; import 'package:esse/apps/file/page.dart'; import 'package:esse/apps/service/list.dart'; import 'package:esse/apps/service/add.dart'; +import 'package:esse/apps/assistant/page.dart'; class HomePage extends StatelessWidget { static GlobalKey _scaffoldKey = new GlobalKey(); @@ -89,7 +90,6 @@ class HomePage extends StatelessWidget { class HomeList extends StatefulWidget { final GlobalKey _scaffoldKey; - HomeList(this._scaffoldKey); @override @@ -97,11 +97,6 @@ class HomeList extends StatefulWidget { } class _HomeListState extends State with SingleTickerProviderStateMixin { - bool isShowHome = true; - bool isShowFriends = false; - bool isShowGroups = false; - bool isShowFiles = false; - bool isProcess = true; AnimationController controller; @@ -125,70 +120,34 @@ class _HomeListState extends State with SingleTickerProviderStateMixin super.dispose(); } - showHome() { - setState(() { - this.isShowHome = true; - this.isShowFriends = false; - this.isShowGroups = false; - this.isShowFiles = false; - }); - } - - showFriends() { - setState(() { - this.isShowHome = false; - this.isShowFriends = true; - this.isShowGroups = false; - this.isShowFiles = false; - }); - } - - showGroups() { - setState(() { - this.isShowHome = false; - this.isShowFriends = false; - this.isShowGroups = true; - this.isShowFiles = false; - }); - } - - showFiles() { - setState(() { - this.isShowHome = false; - this.isShowFriends = false; - this.isShowGroups = false; - this.isShowFiles = true; - }); - } - - scanQr(bool isDesktop) { + _scanQr(bool isDesktop) { Navigator.push( - context, - MaterialPageRoute( - builder: (context) => QRScan(callback: (isOk, app, params) { - Navigator.of(context).pop(); - if (app == 'add-friend' && params.length == 3) { - final id = params[0]; - final addr = params[1]; - final name = params[2]; - final widget = ChatAddPage(id: id, addr: addr, name: name); - Provider.of(context, listen: false) - .systemAppGroupAddNew = false; - if (isDesktop) { - Provider.of(context, listen: false) - .updateActivedApp(widget); - } else { - Navigator.push( - context, MaterialPageRoute(builder: (_) => widget)); - } - } else if (app == 'distribute' && params.length == 4) { - final _name = params[0]; - final id = params[1]; - final addr = params[2]; - final _mnemonicWords = params[3]; - Provider.of(context, listen: false).connect(addr); - } - }))); + context, + MaterialPageRoute( + builder: (context) => QRScan(callback: (isOk, app, params) { + Navigator.of(context).pop(); + if (app == 'add-friend' && params.length == 3) { + final id = params[0]; + final addr = params[1]; + final name = params[2]; + final widget = ChatAddPage(id: id, addr: addr, name: name); + Provider.of(context, listen: false) + .systemAppGroupAddNew = false; + if (isDesktop) { + Provider.of(context, listen: false) + .updateActivedApp(widget); + } else { + Navigator.push( + context, MaterialPageRoute(builder: (_) => widget)); + } + } else if (app == 'distribute' && params.length == 4) { + final _name = params[0]; + final id = params[1]; + final addr = params[2]; + final _mnemonicWords = params[3]; + Provider.of(context, listen: false).connect(addr); + } + }))); } @override @@ -221,94 +180,79 @@ class _HomeListState extends State with SingleTickerProviderStateMixin ), Expanded( child: Center( - child: Text( - isShowFriends - ? lang.chats - : (isShowGroups - ? lang.groups - : (isShowFiles ? lang.files : '')), - style: TextStyle(fontWeight: FontWeight.bold), - ), + child: Text(provider.homeShowTitle, style: TextStyle(fontWeight: FontWeight.bold)), )), Icon(Icons.search_rounded, color: color.primary), const SizedBox(width: 20.0), Stack( children: [ Container( - width: 28.0, - height: 28.0, - child: this.isShowHome - ? PopupMenuButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(15)), - color: const Color(0xFFEDEDED), - child: Icon(Icons.add_circle_outline_rounded, - color: color.primary), - onSelected: (int value) { - if (value == 0) { - scanQr(isDesktop); - } else if (value == 1) { - final widget = ChatAddPage(); - if (isDesktop) { - provider.updateActivedApp(widget); - } else { - provider.systemAppFriendAddNew = false; - setState(() {}); - Navigator.push( - context, - MaterialPageRoute( - builder: (_) => widget)); - } - } else if (value == 2) { - final widget = GroupAddPage(); - if (isDesktop) { - provider.updateActivedApp(widget); - } else { - provider.systemAppFriendAddNew = false; - setState(() {}); - Navigator.push( - context, - MaterialPageRoute( - builder: (_) => widget)); - } - } else if (value == 3) { - showShadowDialog( - context, - Icons.info, - lang.info, - UserInfo( - id: provider.activedAccount.id, - name: provider.activedAccount.name, - addr: Global.addr)); - } - }, - itemBuilder: (context) { - return >[ - _menuItem(0, Icons.qr_code_scanner_rounded, lang.scan), - _menuItem(1, Icons.person_add_rounded, lang.addFriend, - provider.systemAppFriendAddNew), - _menuItem(2, Icons.add_business_rounded, lang.addGroup, - provider.systemAppGroupAddNew), - _menuItem(3, Icons.qr_code_rounded, lang.myQrcode), - ]; - }, - ) - : GestureDetector( - onTap: showHome, - child: Icon(Icons.home_outlined, - color: color.primary))), - if (provider.systemAppFriendAddNew || - provider.systemAppGroupAddNew) - Positioned( - top: 0, - right: 0, - child: Container( - width: 8.0, - height: 8.0, - decoration: BoxDecoration( - color: Colors.red, - shape: BoxShape.circle, - ))), + width: 28.0, + height: 28.0, + child: provider.homeShowTitle == '' + ? PopupMenuButton( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15)), + color: const Color(0xFFEDEDED), + child: Icon(Icons.add_circle_outline_rounded, + color: color.primary), + onSelected: (int value) { + if (value == 0) { + _scanQr(isDesktop); + } else if (value == 1) { + final widget = ChatAddPage(); + if (isDesktop) { + provider.updateActivedApp(widget); + } else { + provider.systemAppFriendAddNew = false; + setState(() {}); + Navigator.push(context, MaterialPageRoute(builder: (_) => widget)); + } + } else if (value == 2) { + final widget = GroupAddPage(); + if (isDesktop) { + provider.updateActivedApp(widget); + } else { + provider.systemAppFriendAddNew = false; + setState(() {}); + Navigator.push(context, MaterialPageRoute(builder: (_) => widget)); + } + } else if (value == 3) { + showShadowDialog( + context, + Icons.info, + lang.info, + UserInfo( + id: provider.activedAccount.id, + name: provider.activedAccount.name, + addr: Global.addr) + ); + } + }, + itemBuilder: (context) { + return >[ + _menuItem(0, Icons.qr_code_scanner_rounded, lang.scan), + _menuItem(1, Icons.person_add_rounded, lang.addFriend, + provider.systemAppFriendAddNew), + _menuItem(2, Icons.add_business_rounded, lang.addGroup, + provider.systemAppGroupAddNew), + _menuItem(3, Icons.qr_code_rounded, lang.myQrcode), + ]; + }, + ) + : GestureDetector(onTap: () => provider.updateToHome(), + child: Icon(Icons.home_outlined, color: color.primary))), + if (provider.systemAppFriendAddNew || provider.systemAppGroupAddNew) + Positioned( + top: 0, + right: 0, + child: Container( + width: 8.0, + height: 8.0, + decoration: BoxDecoration( + color: Colors.red, + shape: BoxShape.circle, + ))), ], ), ], @@ -316,41 +260,16 @@ class _HomeListState extends State with SingleTickerProviderStateMixin ), const SizedBox(height: 10.0), isProcess - ? LinearProgressIndicator( - backgroundColor: Color(0x40ADB0BB), - valueColor: AlwaysStoppedAnimation(color.primary), - value: controller.value, - ) - : const Divider(height: 1.0, color: Color(0x40ADB0BB)), + ? LinearProgressIndicator( + backgroundColor: Color(0x40ADB0BB), + valueColor: AlwaysStoppedAnimation(color.primary), + value: controller.value, + ) + : const Divider(height: 1.0, color: Color(0x40ADB0BB)), const SizedBox(height: 5.0), - if (this.isShowHome) - Column(children: [ - ListSystemApp( - name: lang.chats, - icon: Icons.people_rounded, - callback: () => showFriends()), - ListSystemApp( - name: lang.groups, - icon: Icons.grid_view_rounded, - callback: () => showGroups()), - ListSystemApp( - name: lang.files, - icon: Icons.folder_rounded, - callback: () => showFiles()), - const SizedBox(height: 5.0), - const Divider(height: 1.0, color: Color(0x40ADB0BB)), - const SizedBox(height: 5.0), - ]), - if (this.isShowHome) Expanded( - child: ListView.builder( - itemCount: chatTops.length, - itemBuilder: (BuildContext ctx, int index) => ListChat( - friend: friends[chatTops.keys.elementAt(index)]), - )), - if (this.isShowFriends) ChatList(), - if (this.isShowGroups) ServiceList(), - if (this.isShowFiles) FolderList(), + child: provider.homeShowWidget, + ) ], ), ); diff --git a/lib/provider.dart b/lib/provider.dart index aeb499c..a783ae1 100644 --- a/lib/provider.dart +++ b/lib/provider.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; import 'package:esse/account.dart'; import 'package:esse/utils/logined_cache.dart'; import 'package:esse/widgets/default_core_show.dart'; +import 'package:esse/widgets/default_home_show.dart'; import 'package:esse/global.dart'; import 'package:esse/rpc.dart'; @@ -23,10 +24,15 @@ class AccountProvider extends ChangeNotifier { /// current user's did. String get id => this.activedAccount.id; + String homeShowTitle = ''; + Widget defaultListShow = DefaultHomeShow(); + Widget currentListShow = null; Widget coreShowWidget = DefaultCoreShow(); bool systemAppFriendAddNew = false; bool systemAppGroupAddNew = false; + Widget get homeShowWidget => this.currentListShow ?? this.defaultListShow; + AccountProvider() { // rpc notice when account not actived. rpc.addNotice(_accountNotice); @@ -86,8 +92,8 @@ class AccountProvider extends ChangeNotifier { this.clearActivedAccount(); this.activedAccountId = gid; this.activedAccount.hasNew = false; - - rpc.send('friend-list', []); + this.coreShowWidget = DefaultCoreShow(); + this.currentListShow = null; if (!this.activedAccount.online) { this.activedAccount.online = true; @@ -103,6 +109,7 @@ class AccountProvider extends ChangeNotifier { logout() { this.accounts.clear(); this.clearActivedAccount(); + this.currentListShow = null; rpc.send('account-logout', []); clearLogined(); } @@ -130,8 +137,20 @@ class AccountProvider extends ChangeNotifier { notifyListeners(); } - updateActivedApp(Widget widget) { - this.coreShowWidget = widget; + updateToHome() { + this.homeShowTitle = ''; + this.currentListShow = null; + notifyListeners(); + } + + updateActivedApp([Widget coreWidget, String title, Widget homeWidget]) { + if (homeWidget != null && title != null) { + this.homeShowTitle = title; + this.currentListShow = homeWidget; + } + if (coreWidget != null) { + this.coreShowWidget = coreWidget; + } this.systemAppFriendAddNew = false; notifyListeners(); } diff --git a/lib/widgets/default_home_show.dart b/lib/widgets/default_home_show.dart new file mode 100644 index 0000000..6059fe0 --- /dev/null +++ b/lib/widgets/default_home_show.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'package:esse/l10n/localizations.dart'; +import 'package:esse/utils/adaptive.dart'; +import 'package:esse/widgets/list_system_app.dart'; +import 'package:esse/options.dart'; +import 'package:esse/provider.dart'; + +import 'package:esse/apps/service/list.dart'; +import 'package:esse/apps/service/models.dart'; +import 'package:esse/apps/chat/provider.dart'; +import 'package:esse/apps/chat/list.dart'; + +class DefaultHomeShow extends StatelessWidget { + const DefaultHomeShow({Key key}): super(key: key); + + @override + Widget build(BuildContext context) { + final isDesktop = isDisplayDesktop(context); + final lang = AppLocalizations.of(context); + final chatProvider = context.watch(); + final chatTops = chatProvider.topKeys; + final friends = chatProvider.friends; + + return Column(children: [ + ListSystemApp(name: lang.chats, icon: Icons.people_rounded, + callback: () => Provider.of(context, listen: false).updateActivedApp( + null, lang.chats, ChatList())), + ListSystemApp(name: lang.groups, icon: Icons.grid_view_rounded, + callback: () => Provider.of(context, listen: false).updateActivedApp( + null, lang.chats, ServiceList())), + const SizedBox(height: 5.0), + const Divider(height: 1.0, color: Color(0x40ADB0BB)), + const SizedBox(height: 5.0), + Column( + children: INNER_SERVICES.map((v) { + final params = v.params(lang); + return ListInnerService( + name: params[0], + bio: params[1], + logo: params[2], + callback: () => v.callback(context, isDesktop, lang), + isDesktop: isDesktop, + ); + }).toList() + ), + Expanded( + child: ListView.builder( + itemCount: chatTops.length, + itemBuilder: (BuildContext ctx, int index) => ListChat( + friend: friends[chatTops.keys.elementAt(index)]), + ), + ) + ]); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 1ea24e8..dc1486d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -70,7 +70,8 @@ flutter: - assets/logo/logo_dark.png - assets/logo/logo_light.png - assets/logo/logo_40.jpg - - assets/logo/logo_esse.jpg + - assets/logo/logo_assistant.png + - assets/logo/logo_files.png - assets/images/background_light.jpg - assets/images/background_dark.jpg - assets/images/image_missing.png diff --git a/src/apps/chat/models.rs b/src/apps/chat/models.rs index 9c3de18..22b5915 100644 --- a/src/apps/chat/models.rs +++ b/src/apps/chat/models.rs @@ -491,7 +491,9 @@ impl Request { } pub fn to_friend(self) -> Friend { - Friend::new(self.gid, self.addr, self.name, self.remark) + let mut friend = Friend::new(self.gid, self.addr, self.name, self.remark); + friend.is_top = true; // default set to top page. + friend } /// here is zero-copy and unwrap is safe. checked.