diff --git a/assets/logo/logo_assistant.png b/assets/logo/logo_assistant.png new file mode 100644 index 0000000..ad14f2f Binary files /dev/null and b/assets/logo/logo_assistant.png differ diff --git a/assets/logo/logo_esse.jpg b/assets/logo/logo_esse.jpg deleted file mode 100644 index 6611431..0000000 Binary files a/assets/logo/logo_esse.jpg and /dev/null differ diff --git a/assets/logo/logo_files.png b/assets/logo/logo_files.png new file mode 100644 index 0000000..49ad44b Binary files /dev/null and b/assets/logo/logo_files.png differ diff --git a/lib/apps/assistant/page.dart b/lib/apps/assistant/page.dart index 4a74365..a67b7a9 100644 --- a/lib/apps/assistant/page.dart +++ b/lib/apps/assistant/page.dart @@ -19,14 +19,26 @@ import 'package:esse/apps/assistant/provider.dart'; import 'package:esse/apps/assistant/message.dart'; import 'package:esse/apps/assistant/answer.dart'; -class AssistantPage extends StatefulWidget { +class AssistantPage extends StatelessWidget { const AssistantPage({Key key}) : super(key: key); @override - _AssistantPageState createState() => _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.