Browse Source

Breaking: refactor home page style

pull/18/head
Sun 4 years ago
parent
commit
7b0bcca165
  1. BIN
      assets/logo/logo_chat.png
  2. BIN
      assets/logo/logo_cloud.png
  3. BIN
      assets/logo/logo_files.png
  4. 4
      lib/apps/chat/add.dart
  5. 8
      lib/apps/chat/list.dart
  6. 4
      lib/apps/domain/page.dart
  7. 65
      lib/apps/file/list.dart
  8. 8
      lib/apps/group_chat/list.dart
  9. 8
      lib/apps/service/add.dart
  10. 146
      lib/apps/service/list.dart
  11. 26
      lib/apps/service/models.dart
  12. 9
      lib/l10n/localizations.dart
  13. 18
      lib/l10n/localizations_en.dart
  14. 20
      lib/l10n/localizations_zh.dart
  15. 420
      lib/pages/home.dart
  16. 14
      lib/session.dart
  17. 6
      lib/theme.dart
  18. 7
      pubspec.lock
  19. 4
      pubspec.yaml
  20. 3
      src/migrate/domain.rs
  21. 5
      src/migrate/session.rs
  22. 17
      src/session.rs

BIN
assets/logo/logo_chat.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

BIN
assets/logo/logo_cloud.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

BIN
assets/logo/logo_files.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

4
lib/apps/chat/add.dart

@ -173,10 +173,6 @@ class _ChatAddPageState extends State<ChatAddPage> { @@ -173,10 +173,6 @@ class _ChatAddPageState extends State<ChatAddPage> {
return Scaffold(
appBar: AppBar(
title: Text(lang.addFriend),
bottom: PreferredSize(
child: Container(color: const Color(0x40ADB0BB), height: 1.0),
preferredSize: Size.fromHeight(1.0)
),
leading: isDesktop
? IconButton(
onPressed: () {

8
lib/apps/chat/list.dart

@ -29,13 +29,7 @@ class _ChatListState extends State<ChatList> { @@ -29,13 +29,7 @@ class _ChatListState extends State<ChatList> {
final chatKeys = provider.orderKeys;
return Scaffold(
appBar: AppBar(
title: Text(lang.friends),
bottom: PreferredSize(
child: Container(color: const Color(0x40ADB0BB), height: 1.0),
preferredSize: Size.fromHeight(1.0)
),
),
appBar: AppBar(title: Text(lang.contact)),
body: Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0),
child: ListView.builder(

4
lib/apps/domain/page.dart

@ -80,10 +80,6 @@ class _DomainDetailState extends State<DomainDetail> { @@ -80,10 +80,6 @@ class _DomainDetailState extends State<DomainDetail> {
return Scaffold(
appBar: AppBar(
title: Text(lang.domain),
bottom: PreferredSize(
child: Container(color: const Color(0x40ADB0BB), height: 1.0),
preferredSize: Size.fromHeight(1.0)
),
actions: [
TextButton(
onPressed: () {

65
lib/apps/file/list.dart

@ -6,20 +6,23 @@ import 'package:esse/utils/file_image.dart'; @@ -6,20 +6,23 @@ import 'package:esse/utils/file_image.dart';
import 'package:esse/l10n/localizations.dart';
//import 'package:esse/provider.dart';
const List FILE_DIRECTORY = [
["Starred", Icons.star, "started"],
["Documents", Icons.description, "documents"],
["Images", Icons.image, "images"],
["Musics", Icons.music_note, "musics"],
["Videos", Icons.play_circle_filled, "videos"],
["Trash", Icons.auto_delete, "trash"],
];
class FilesList extends StatefulWidget {
const FilesList({Key? key}) : super(key: key);
final String root;
const FilesList({Key? key, required this.root}) : super(key: key);
@override
_FilesListState createState() => _FilesListState();
}
const List FILE_DIRECTORY = [
["Starred", Icons.star],
["Documents", Icons.description],
["Media", Icons.music_video],
["Trash", Icons.auto_delete],
];
class _FilesListState extends State<FilesList> {
@override
void initState() {
@ -38,64 +41,22 @@ class _FilesListState extends State<FilesList> { @@ -38,64 +41,22 @@ class _FilesListState extends State<FilesList> {
});
}
Widget item(String name, IconData icon, ColorScheme color, bool isDesktop) {
return Container(
width: 140,
height: 50,
decoration: BoxDecoration(
color: color.surface,
borderRadius: BorderRadius.circular(15.0),
),
child: InkWell(
onTap: () => changeItem(name, isDesktop),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.only(left: 16.0, right: 8.0),
child: Icon(icon, color: color.primary),
),
Expanded(
child: Text(name, style: TextStyle(fontSize: 14.0))
)
]
)),
);
}
@override
Widget build(BuildContext context) {
final color = Theme.of(context).colorScheme;
final lang = AppLocalizations.of(context);
final isDesktop = isDisplayDesktop(context);
final List<Widget> widgets = FILE_DIRECTORY.map(
(i) => item(i[0], i[1], color, isDesktop)
).toList();
return Scaffold(
appBar: AppBar(
title: Text(lang.files + ' (${lang.wip})'),
bottom: PreferredSize(
child: Container(color: const Color(0x40ADB0BB), height: 1.0),
preferredSize: Size.fromHeight(1.0)
),
),
appBar: AppBar(title: Text(lang.dataCenter + ' (${lang.wip})')),
body: Padding(
padding: const EdgeInsets.all(10.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(height: 10.0),
Wrap(
spacing: 10.0,
runSpacing: 10.0,
children: widgets,
),
const SizedBox(height: 20.0),
Align(
alignment: Alignment.centerLeft,
child: Text('Recents', style: Theme.of(context).textTheme.caption)
child: Text('/' + widget.root, style: Theme.of(context).textTheme.caption)
),
Expanded(
child: GridView.extent(

8
lib/apps/group_chat/list.dart

@ -29,13 +29,7 @@ class _GroupChatListState extends State<GroupChatList> { @@ -29,13 +29,7 @@ class _GroupChatListState extends State<GroupChatList> {
final groups = provider.groups;
return Scaffold(
appBar: AppBar(
title: Text(lang.groupChats),
bottom: PreferredSize(
child: Container(color: const Color(0x40ADB0BB), height: 1.0),
preferredSize: Size.fromHeight(1.0)
),
),
appBar: AppBar(title: Text(lang.groupChats)),
body: Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0),
child: ListView.builder(

8
lib/apps/service/add.dart

@ -13,13 +13,7 @@ class ServiceAddPage extends StatelessWidget { @@ -13,13 +13,7 @@ class ServiceAddPage extends StatelessWidget {
final lang = AppLocalizations.of(context);
return Scaffold(
appBar: AppBar(
title: Text(lang.addService),
bottom: PreferredSize(
child: Container(color: const Color(0x40ADB0BB), height: 1.0),
preferredSize: Size.fromHeight(1.0)
),
),
appBar: AppBar(title: Text(lang.addService)),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0),

146
lib/apps/service/list.dart

@ -1,146 +0,0 @@ @@ -1,146 +0,0 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
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/service/add.dart';
const List<InnerService> INNER_SERVICES = [
InnerService.Files,
InnerService.Assistant,
InnerService.GroupChat,
InnerService.Domain,
];
class ServiceList extends StatefulWidget {
const ServiceList({Key? key}) : super(key: key);
@override
_ServiceListState createState() => _ServiceListState();
}
class _ServiceListState extends State<ServiceList> {
@override
Widget build(BuildContext context) {
final lang = AppLocalizations.of(context);
final isDesktop = isDisplayDesktop(context);
return Scaffold(
appBar: AppBar(
title: Text(lang.services),
bottom: PreferredSize(
child: Container(color: const Color(0x40ADB0BB), height: 1.0),
preferredSize: Size.fromHeight(1.0)
),
),
body: Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0),
child: ListView.builder(
itemCount: INNER_SERVICES.length,
itemBuilder: (BuildContext ctx, int index) {
final params = INNER_SERVICES[index].params(lang);
return ListInnerService(
name: params[0],
bio: params[1],
logo: params[2],
callback: () => INNER_SERVICES[index].callback(),
isDesktop: isDesktop,
);
}
)
),
floatingActionButton: FloatingActionButton(
onPressed: () {
final widget = ServiceAddPage();
if (isDesktop) {
Provider.of<AccountProvider>(context, listen: false).updateActivedWidget(widget);
} else {
Navigator.push(context, MaterialPageRoute(builder: (_) => widget));
}
},
child: const Icon(Icons.add, color: Colors.white),
backgroundColor: Color(0xFF6174FF),
),
);
}
}
class ListInnerService extends StatelessWidget {
final String name;
final String? bio;
final String logo;
final Function callback;
final bool isDesktop;
const ListInnerService({Key? key,
required this.name, this.bio, required this.logo, required this.callback, required this.isDesktop
}) : super(key: key);
@override
Widget build(BuildContext context) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
final widget = this.callback();
if (widget != null) {
if (this.isDesktop) {
Provider.of<AccountProvider>(context, listen: false).updateActivedWidget(widget);
} else {
Navigator.push(context, MaterialPageRoute(builder: (_) => widget));
}
}
},
child: Container(
height: 55.0,
child: Row(
children: [
Container(
width: 45.0,
height: 45.0,
padding: const EdgeInsets.all(6.0),
margin: const EdgeInsets.only(left: 20.0, right: 15.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),
),
child: Image.asset(this.logo),
),
this.bio == null
? Text(this.name, style: TextStyle(fontSize: 16.0))
: Expanded(
child: Container(
height: 55.0,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Expanded(
child: Text(this.name, maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 16.0)))
]
),
const SizedBox(height: 4.0),
Row(
children: [
Expanded(
child: Text(this.bio!, maxLines: 1,
overflow: TextOverflow.ellipsis,
style: const TextStyle(color: Color(0xFFADB0BB), fontSize: 12.0)),
),
]
)
],
),
),
),
],
),
),
);
}
}

26
lib/apps/service/models.dart

@ -5,38 +5,52 @@ import 'package:esse/apps/assistant/page.dart'; @@ -5,38 +5,52 @@ import 'package:esse/apps/assistant/page.dart';
import 'package:esse/apps/file/list.dart';
import 'package:esse/apps/group_chat/list.dart';
import 'package:esse/apps/domain/page.dart';
import 'package:esse/apps/chat/list.dart';
const List<InnerService> INNER_SERVICES = [
InnerService.Chat,
InnerService.GroupChat,
InnerService.Assistant,
InnerService.Domain,
//InnerService.Cloud,
];
enum InnerService {
Files,
Assistant,
Chat,
GroupChat,
Assistant,
Domain,
Cloud,
}
extension InnerServiceExtension on InnerService {
List<String> params(AppLocalizations lang) {
switch (this) {
case InnerService.Files:
return [lang.files, lang.filesBio, 'assets/logo/logo_files.png'];
case InnerService.Chat:
return [lang.contact, lang.contactIntro, 'assets/logo/logo_chat.png'];
case InnerService.Assistant:
return [lang.assistant, lang.assistantBio, 'assets/logo/logo_assistant.png'];
case InnerService.GroupChat:
return [lang.groupChat, lang.groupChatIntro, 'assets/logo/logo_group_chat.png'];
case InnerService.Domain:
return [lang.domain, lang.domainIntro, 'assets/logo/logo_domain.png'];
case InnerService.Cloud:
return [lang.cloud, lang.cloudIntro, 'assets/logo/logo_domain.png'];
}
}
Widget callback() {
switch (this) {
case InnerService.Files:
return FilesList();
case InnerService.Chat:
return ChatList();
case InnerService.Assistant:
return AssistantDetail();
case InnerService.GroupChat:
return GroupChatList();
case InnerService.Domain:
return DomainDetail();
case InnerService.Cloud:
return DomainDetail();
}
}
}

9
lib/l10n/localizations.dart

@ -48,9 +48,7 @@ abstract class AppLocalizations { @@ -48,9 +48,7 @@ abstract class AppLocalizations {
String get setting;
String get search;
String get info;
String get contact;
String get friend;
String get friends;
String get logout;
String get onlineWaiting;
String get onlineActive;
@ -123,12 +121,16 @@ abstract class AppLocalizations { @@ -123,12 +121,16 @@ abstract class AppLocalizations {
// homeage
String get addFriend;
String get addService;
String get sessions;
String get services;
String get dataCenter;
String get devices;
String get nightly;
String get scan;
// friend
String get contact;
String get contactIntro;
String get myQrcode;
String get qrFriend;
String get friendInfo;
@ -215,6 +217,9 @@ abstract class AppLocalizations { @@ -215,6 +217,9 @@ abstract class AppLocalizations {
String get domainAddProvider;
String get domainSearch;
String get domainRegisterFailure;
String get cloud;
String get cloudIntro;
}
class _AppLocalizationsDelegate

18
lib/l10n/localizations_en.dart

@ -21,12 +21,8 @@ class AppLocalizationsEn extends AppLocalizations { @@ -21,12 +21,8 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get info => 'Info';
@override
String get contact => 'Contacts';
@override
String get friend => 'Friend';
@override
String get friends => 'Friends';
@override
String get logout => 'Logout';
@override
String get onlineWaiting => 'Waiting...';
@ -163,8 +159,12 @@ class AppLocalizationsEn extends AppLocalizations { @@ -163,8 +159,12 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get addService => 'Add Service';
@override
String get sessions => 'Sessions';
@override
String get services => 'Services';
@override
String get dataCenter => 'IDC';
@override
String get devices => 'Devices';
@override
String get nightly => 'Night Mode';
@ -173,6 +173,10 @@ class AppLocalizationsEn extends AppLocalizations { @@ -173,6 +173,10 @@ class AppLocalizationsEn extends AppLocalizations {
// friend
@override
String get contact => 'Contacts';
@override
String get contactIntro => 'Chat with friends security';
@override
String get myQrcode => 'My QRCode';
@override
String get qrFriend => 'Scan for Add Friend';
@ -263,7 +267,7 @@ class AppLocalizationsEn extends AppLocalizations { @@ -263,7 +267,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get assistant => 'Jarvis';
@override
String get assistantBio => 'Jarvis is a robot, only belongs to you.';
String get assistantBio => 'Jarvis is a robot, only belongs to you';
@override
String get groupChat => 'Group Chat';
@override
@ -334,4 +338,8 @@ class AppLocalizationsEn extends AppLocalizations { @@ -334,4 +338,8 @@ class AppLocalizationsEn extends AppLocalizations {
String get domainSearch => 'Domain Search';
@override
String get domainRegisterFailure => 'name already existed!';
@override
String get cloud => 'Cloud Peer';
@override
String get cloudIntro => 'Cloud hosting peer belongs to you';
}

20
lib/l10n/localizations_zh.dart

@ -21,12 +21,8 @@ class AppLocalizationsZh extends AppLocalizations { @@ -21,12 +21,8 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get info => '信息';
@override
String get contact => '联系人';
@override
String get friend => '好友';
@override
String get friends => '好友';
@override
String get logout => '退出';
@override
String get onlineWaiting => '连接中...';
@ -163,8 +159,12 @@ class AppLocalizationsZh extends AppLocalizations { @@ -163,8 +159,12 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get addService => '添加服务';
@override
String get sessions => '会话';
@override
String get services => '服务';
@override
String get dataCenter => '数据中心';
@override
String get devices => '关联设备';
@override
String get nightly => '夜间模式';
@ -173,6 +173,10 @@ class AppLocalizationsZh extends AppLocalizations { @@ -173,6 +173,10 @@ class AppLocalizationsZh extends AppLocalizations {
// friend
@override
String get contact => '联系人';
@override
String get contactIntro => '与好友点对点即时通信';
@override
String get myQrcode => '我的二维码';
@override
String get qrFriend => '扫二维码添加好友';
@ -263,7 +267,7 @@ class AppLocalizationsZh extends AppLocalizations { @@ -263,7 +267,7 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get assistant => 'Jarvis';
@override
String get assistantBio => 'Jarvis 是个机器人,只属于你';
String get assistantBio => 'Jarvis 是个机器人,只属于你';
@override
String get groupChat => '群聊';
@override
@ -315,7 +319,7 @@ class AppLocalizationsZh extends AppLocalizations { @@ -315,7 +319,7 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get groupRequireConsent => "需要管理员同意";
@override
String get domain => '分布式域名';
String get domain => '个人域名';
@override
String get domainIntro => '管理自己的公开身份';
@override
@ -334,4 +338,8 @@ class AppLocalizationsZh extends AppLocalizations { @@ -334,4 +338,8 @@ class AppLocalizationsZh extends AppLocalizations {
String get domainSearch => '域名搜索';
@override
String get domainRegisterFailure => '用户名已存在!';
@override
String get cloud => '云节点';
@override
String get cloudIntro => '专属于个人的云节点服务';
}

420
lib/pages/home.dart

@ -5,6 +5,7 @@ import 'package:flutter/services.dart'; @@ -5,6 +5,7 @@ import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:provider/provider.dart';
import 'package:flutter/cupertino.dart' show CupertinoSwitch;
import 'package:bottom_navy_bar/bottom_navy_bar.dart';
import 'package:esse/l10n/localizations.dart';
import 'package:esse/utils/adaptive.dart';
@ -29,7 +30,7 @@ import 'package:esse/apps/chat/list.dart'; @@ -29,7 +30,7 @@ import 'package:esse/apps/chat/list.dart';
import 'package:esse/apps/chat/detail.dart';
import 'package:esse/apps/chat/add.dart';
import 'package:esse/apps/file/list.dart';
import 'package:esse/apps/service/list.dart';
import 'package:esse/apps/service/models.dart';
import 'package:esse/apps/assistant/page.dart';
import 'package:esse/apps/group_chat/add.dart';
import 'package:esse/apps/group_chat/list.dart';
@ -52,29 +53,27 @@ class HomePage extends StatelessWidget { @@ -52,29 +53,27 @@ class HomePage extends StatelessWidget {
}
return WillPopScope(
onWillPop: () async {
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
return false;
},
child: Scaffold(
drawer: const DrawerWidget(),
drawerScrimColor: const Color(0x26ADB0BB),
body: AnnotatedRegion<SystemUiOverlayStyle>(
value: style.copyWith(statusBarColor: colorScheme.background),
child: SafeArea(
child: isDesktop
? Row(children: [
Container(
width: 375.0,
child: HomeList(),
),
const SizedBox(width: 20.0),
Expanded(
child: context
.watch<AccountProvider>()
.coreShowWidget),
])
: HomeList()))));
onWillPop: () async {
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
return false;
},
child: Scaffold(
drawer: const DrawerWidget(),
drawerScrimColor: const Color(0x26ADB0BB),
body: AnnotatedRegion<SystemUiOverlayStyle>(
value: style.copyWith(statusBarColor: colorScheme.secondary),
child: SafeArea(
child: isDesktop
? Row(children: [
Container(
width: 375.0,
decoration: BoxDecoration(color: colorScheme.secondary),
child: HomeList()
),
Expanded(child: context.watch<AccountProvider>().coreShowWidget),
])
: HomeList()
))));
}
}
@ -86,35 +85,44 @@ class HomeList extends StatefulWidget { @@ -86,35 +85,44 @@ class HomeList extends StatefulWidget {
}
class _HomeListState extends State<HomeList> {
int _currentIndex = 0;
PageController _pageController = PageController();
@override
void dispose() {
_pageController.dispose();
super.dispose();
}
_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<AccountProvider>(context, listen: false)
.systemAppFriendAddNew = false;
if (isDesktop) {
Provider.of<AccountProvider>(context, listen: false)
.updateActivedWidget(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<DeviceProvider>(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<AccountProvider>(context, listen: false)
.systemAppFriendAddNew = false;
if (isDesktop) {
Provider.of<AccountProvider>(context, listen: false)
.updateActivedWidget(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<DeviceProvider>(context, listen: false)
.connect(addr);
}
})));
}
@override
@ -127,97 +135,184 @@ class _HomeListState extends State<HomeList> { @@ -127,97 +135,184 @@ class _HomeListState extends State<HomeList> {
final sessions = provider.sessions;
return Scaffold(
backgroundColor: Colors.transparent,
appBar: AppBar(
leading: IconButton(
icon: const Icon(Icons.menu),
onPressed: () => Scaffold.of(context).openDrawer(),
leading: IconButton(
icon: const Icon(Icons.menu),
onPressed: () => Scaffold.of(context).openDrawer(),
),
bottom: PreferredSize(
child: Container(color: const Color(0x40ADB0BB), height: 1.0),
preferredSize: Size.fromHeight(1.0)),
actions: [
IconButton(
icon: const Icon(Icons.search),
onPressed: null,
),
bottom: PreferredSize(
child: Container(color: const Color(0x40ADB0BB), height: 1.0),
preferredSize: Size.fromHeight(1.0)),
actions: [
IconButton(
icon: const Icon(Icons.search),
onPressed: null,
),
Container(
margin: const EdgeInsets.symmetric(horizontal: 20.0),
alignment: Alignment.center,
child: Stack(
children: <Widget>[
PopupMenuButton<int>(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15)),
color: const Color(0xFFEDEDED),
child: Icon(Icons.add_circle_outline, color: color.primary),
onSelected: (int value) {
if (value == 0) {
_scanQr(isDesktop);
} else if (value == 1) {
final widget = ChatAddPage();
provider.systemAppFriendAddNew = false;
if (isDesktop) {
provider.updateActivedWidget(widget);
} else {
setState(() {});
Navigator.push(context,
MaterialPageRoute(builder: (_) => widget));
}
} else if (value == 2) {
final widget = GroupAddPage();
if (isDesktop) {
provider.updateActivedWidget(widget);
} else {
setState(() {});
Navigator.push(context,
MaterialPageRoute(builder: (_) => widget));
}
} else if (value == 3) {
showShadowDialog(
context,
Icons.info,
lang.info,
UserInfo(
app: 'add-friend',
id: provider.id,
name: provider.activedAccount.name,
addr: Global.addr));
Container(
margin: const EdgeInsets.symmetric(horizontal: 20.0),
alignment: Alignment.center,
child: Stack(
children: <Widget>[
PopupMenuButton<int>(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15)),
color: const Color(0xFFEDEDED),
child: Icon(Icons.add_circle_outline, color: color.primary),
onSelected: (int value) {
if (value == 0) {
_scanQr(isDesktop);
} else if (value == 1) {
final widget = ChatAddPage();
provider.systemAppFriendAddNew = false;
if (isDesktop) {
provider.updateActivedWidget(widget);
} else {
setState(() {});
Navigator.push(context,
MaterialPageRoute(builder: (_) => widget));
}
},
itemBuilder: (context) {
return <PopupMenuEntry<int>>[
_menuItem(0, Icons.qr_code_scanner_rounded, lang.scan),
_menuItem(1, Icons.person_add_rounded, lang.addFriend,
provider.systemAppFriendAddNew),
_menuItem(
2, Icons.group_add_rounded, lang.groupChatAdd),
_menuItem(3, Icons.qr_code_rounded, lang.myQrcode),
];
},
),
if (provider.systemAppFriendAddNew)
Positioned(
top: 0,
right: 0,
child: Container(
width: 8.0,
height: 8.0,
decoration: BoxDecoration(
color: Colors.red,
shape: BoxShape.circle,
))),
],
),
)
]),
body: Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0),
child: ListView.builder(
itemCount: allKeys.length,
itemBuilder: (BuildContext ctx, int index) =>
} else if (value == 2) {
final widget = GroupAddPage();
if (isDesktop) {
provider.updateActivedWidget(widget);
} else {
setState(() {});
Navigator.push(context,
MaterialPageRoute(builder: (_) => widget));
}
} else if (value == 3) {
showShadowDialog(
context,
Icons.info,
lang.info,
UserInfo(
app: 'add-friend',
id: provider.id,
name: provider.activedAccount.name,
addr: Global.addr));
}
},
itemBuilder: (context) {
return <PopupMenuEntry<int>>[
_menuItem(0, Icons.qr_code_scanner_rounded, lang.scan),
_menuItem(1, Icons.person_add_rounded, lang.addFriend,
provider.systemAppFriendAddNew),
_menuItem(
2, Icons.group_add_rounded, lang.groupChatAdd),
_menuItem(3, Icons.qr_code_rounded, lang.myQrcode),
];
},
),
if (provider.systemAppFriendAddNew)
Positioned(
top: 0,
right: 0,
child: Container(
width: 8.0,
height: 8.0,
decoration: BoxDecoration(
color: Colors.red,
shape: BoxShape.circle,
))),
],
),
)
]),
body: SizedBox.expand(
child: PageView(
controller: _pageController,
onPageChanged: (index) {
setState(() => _currentIndex = index);
},
children: <Widget>[
ListView.builder(
itemCount: allKeys.length,
itemBuilder: (BuildContext ctx, int index) =>
_SessionWidget(session: sessions[allKeys[index]]!),
),
ListView.builder(
itemCount: INNER_SERVICES.length,
itemBuilder: (BuildContext ctx, int index) {
final params = INNER_SERVICES[index].params(lang);
return ListTile(
leading: Container(
width: 40.0,
height: 40.0,
padding: const EdgeInsets.all(6.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),
),
child: Image.asset(params[2]),
),
title: Text(params[0], style: TextStyle(fontSize: 16.0)),
subtitle: Text(params[1], style: TextStyle(fontSize: 12.0)),
trailing: Icon(Icons.keyboard_arrow_right, color: Colors.purpleAccent),
onTap: () {
final widget = INNER_SERVICES[index].callback();
if (widget != null) {
if (isDesktop) {
Provider.of<AccountProvider>(context, listen: false).updateActivedWidget(widget);
} else {
Navigator.push(context, MaterialPageRoute(builder: (_) => widget));
}
}
},
);
}
),
ListView.builder(
itemCount: FILE_DIRECTORY.length,
itemBuilder: (BuildContext ctx, int index) {
final params = FILE_DIRECTORY[index];
return ListTile(
leading: Icon(params[1], color: Colors.green),
title: Text(params[0], style: TextStyle(fontSize: 16.0)),
trailing: Icon(Icons.keyboard_arrow_right, color: Colors.green),
onTap: () {
final widget = FilesList(root: params[2]);
if (widget != null) {
if (isDesktop) {
Provider.of<AccountProvider>(context, listen: false).updateActivedWidget(widget);
} else {
Navigator.push(context, MaterialPageRoute(builder: (_) => widget));
}
}
}
);
}
),
],
),
),
bottomNavigationBar: BottomNavyBar(
backgroundColor: color.secondary,
selectedIndex: _currentIndex,
showElevation: true,
containerHeight: 50.0,
onItemSelected: (index) => setState(() {
_currentIndex = index;
_pageController.animateToPage(index,
duration: Duration(milliseconds: 300), curve: Curves.ease);
}),
items: [
BottomNavyBarItem(
icon: Icon(Icons.sms),
title: Text(lang.sessions, style: TextStyle(fontSize: 15.0)),
activeColor: Color(0xFF6174FF),
),
BottomNavyBarItem(
icon: Icon(Icons.apps),
title: Text(lang.services, style: TextStyle(fontSize: 15.0)),
activeColor: Colors.purpleAccent
),
BottomNavyBarItem(
icon: Icon(Icons.source),
title: Text(lang.dataCenter, style: TextStyle(fontSize: 15.0)),
activeColor: Colors.green
),
],
)
);
}
}
@ -346,56 +441,6 @@ class DrawerWidget extends StatelessWidget { @@ -346,56 +441,6 @@ class DrawerWidget extends StatelessWidget {
),
const SizedBox(height: 5.0),
const Divider(height: 1.0, color: Color(0x40ADB0BB)),
ListTile(
leading: Icon(Icons.people_rounded, color: color.primary),
title: Text(lang.friends,
textAlign: TextAlign.left,
style: TextStyle(fontSize: 16.0)),
onTap: () {
Navigator.pop(context);
final coreWidget = ChatList();
if (isDesktop) {
Provider.of<AccountProvider>(context, listen: false)
.updateActivedWidget(coreWidget);
} else {
Navigator.push(context,
MaterialPageRoute(builder: (_) => coreWidget));
}
}),
ListTile(
leading: Icon(Icons.groups_rounded, color: color.primary),
title: Text(lang.groupChats,
textAlign: TextAlign.left,
style: TextStyle(fontSize: 16.0)),
onTap: () {
Navigator.pop(context);
final coreWidget = GroupChatList();
if (isDesktop) {
Provider.of<AccountProvider>(context, listen: false)
.updateActivedWidget(coreWidget);
} else {
Navigator.push(context,
MaterialPageRoute(builder: (_) => coreWidget));
}
}),
ListTile(
leading:
Icon(Icons.grid_view_rounded, color: color.primary),
title: Text(lang.services,
textAlign: TextAlign.left,
style: TextStyle(fontSize: 16.0)),
onTap: () {
Navigator.pop(context);
final coreWidget = ServiceList();
if (isDesktop) {
Provider.of<AccountProvider>(context, listen: false)
.updateActivedWidget(coreWidget);
} else {
Navigator.push(context,
MaterialPageRoute(builder: (_) => coreWidget));
}
}),
const Divider(height: 1.0, color: Color(0x40ADB0BB)),
ListTile(
leading: Icon(Icons.person, color: color.primary),
title: Text(lang.profile,
@ -510,9 +555,6 @@ class _SessionWidget extends StatelessWidget { @@ -510,9 +555,6 @@ class _SessionWidget extends StatelessWidget {
case SessionType.Assistant:
coreWidget = AssistantDetail();
break;
case SessionType.Files:
coreWidget = FilesList();
break;
default:
break; // TODO
}

14
lib/session.dart

@ -10,11 +10,8 @@ import 'package:esse/apps/primitives.dart'; @@ -10,11 +10,8 @@ import 'package:esse/apps/primitives.dart';
enum SessionType {
Chat,
Group,
Files,
Device,
Assistant,
Domain,
Service,
}
extension SessionTypeExtension on SessionType {
@ -25,15 +22,9 @@ extension SessionTypeExtension on SessionType { @@ -25,15 +22,9 @@ extension SessionTypeExtension on SessionType {
case 1:
return SessionType.Group;
case 2:
return SessionType.Files;
case 3:
return SessionType.Device;
case 4:
case 3:
return SessionType.Assistant;
case 5:
return SessionType.Domain;
case 6:
return SessionType.Service;
default:
return SessionType.Chat;
}
@ -148,9 +139,6 @@ class Session { @@ -148,9 +139,6 @@ class Session {
case SessionType.Assistant:
final params = Session.innerService(InnerService.Assistant, lang);
return [params[0], params[1], params[2], '', Icons.campaign];
case SessionType.Files:
final params = Session.innerService(InnerService.Files, lang);
return [params[0], params[1], params[2], '', Icons.campaign];
default:
return [];
}

6
lib/theme.dart

@ -19,7 +19,7 @@ class AppTheme { @@ -19,7 +19,7 @@ class AppTheme {
primaryColor: const Color(0xFF030303),
appBarTheme: AppBarTheme(
toolbarTextStyle: TextStyle(color: colorScheme.onPrimary),
color: colorScheme.background,
color: colorScheme.secondary,
elevation: 0,
iconTheme: IconThemeData(color: colorScheme.primary),
),
@ -44,7 +44,7 @@ class AppTheme { @@ -44,7 +44,7 @@ class AppTheme {
static const ColorScheme lightColorScheme = ColorScheme(
primary: Color(0xFF6174FF),
primaryVariant: Color(0xFFDFE3FF),
secondary: Color(0xFFEFF3F3),
secondary: Color(0XFFF2F2F2),
secondaryVariant: Color(0xFFFAFBFB),
background: Color(0xFFF6F7F8),
surface: Colors.white,
@ -60,7 +60,7 @@ class AppTheme { @@ -60,7 +60,7 @@ class AppTheme {
static const ColorScheme darkColorScheme = ColorScheme(
primary: Colors.white, //Color(0xFF009688),
primaryVariant: Color(0xFFADB0BB), //Color(0xFF4DB6AC),
secondary: Color(0xFF4D1F7C),
secondary: Color(0xFF30273F),
secondaryVariant: Color(0xFF451B6F),
background: Color(0xFF241E30),
surface: Color(0xFF1F1929),

7
pubspec.lock

@ -36,6 +36,13 @@ packages: @@ -36,6 +36,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
bottom_navy_bar:
dependency: "direct main"
description:
name: bottom_navy_bar
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.0"
characters:
dependency: transitive
description:

4
pubspec.yaml

@ -51,6 +51,7 @@ dependencies: @@ -51,6 +51,7 @@ dependencies:
just_audio: any
device_info_plus: any
percent_indicator: any
bottom_navy_bar: ^6.0.0
dev_dependencies:
flutter_test:
@ -71,10 +72,11 @@ flutter: @@ -71,10 +72,11 @@ flutter:
- assets/logo/logo_dark.png
- assets/logo/logo_light.png
- assets/logo/logo_40.jpg
- assets/logo/logo_chat.png
- assets/logo/logo_assistant.png
- assets/logo/logo_files.png
- assets/logo/logo_group_chat.png
- assets/logo/logo_domain.png
- assets/logo/logo_cloud.png
- assets/images/background_light.jpg
- assets/images/background_dark.jpg
- assets/images/image_missing.png

3
src/migrate/domain.rs

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
#[rustfmt::skip]
pub(super) const DOMAIN_VERSIONS: [&str; 2] = [
pub(super) const DOMAIN_VERSIONS: [&str; 3] = [
"CREATE TABLE IF NOT EXISTS names(
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
provider INTEGER NOT NULL,
@ -15,4 +15,5 @@ pub(super) const DOMAIN_VERSIONS: [&str; 2] = [ @@ -15,4 +15,5 @@ pub(super) const DOMAIN_VERSIONS: [&str; 2] = [
is_default INTEGER NOT NULL,
is_proxy INTEGER NOT NULL,
is_actived INTEGER NOT NULL);",
"INSERT INTO providers (name, addr, is_ok, is_default, is_proxy, is_actived) VALUES ('domain.esse', '46d365b061f37b1b6f8a9762d3c8b6d0d8614b49f08a057dc9e75cddc382173c', true, true, true, true);", // domain.esse default inserted.
];

5
src/migrate/session.rs

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
#[rustfmt::skip]
pub(super) const SESSION_VERSIONS: [&str; 3] = [
pub(super) const SESSION_VERSIONS: [&str; 2] = [
"CREATE TABLE IF NOT EXISTS sessions(
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
fid INTEGER NOT NULL,
@ -12,6 +12,5 @@ pub(super) const SESSION_VERSIONS: [&str; 3] = [ @@ -12,6 +12,5 @@ pub(super) const SESSION_VERSIONS: [&str; 3] = [
last_datetime INTEGER,
last_content TEXT,
last_readed INTEGER);",
"INSERT INTO sessions (fid, gid, addr, s_type, name, is_top, is_close, last_datetime, last_content, last_readed) VALUES (0, '', '', 4, '', 0, 0, 0, '', 1);", // Assistant.
"INSERT INTO sessions (fid, gid, addr, s_type, name, is_top, is_close, last_datetime, last_content, last_readed) VALUES (0, '', '', 2, '', 0, 0, 0, '', 1);", // File.
"INSERT INTO sessions (fid, gid, addr, s_type, name, is_top, is_close, last_datetime, last_content, last_readed) VALUES (0, '', '', 3, '', 0, 0, 0, '', 1);", // Assistant.
];

17
src/session.rs

@ -11,11 +11,8 @@ use crate::storage::session_db; @@ -11,11 +11,8 @@ use crate::storage::session_db;
pub(crate) enum SessionType {
Chat,
Group,
Files,
Device,
Assistant,
Domain,
Service,
}
impl SessionType {
@ -23,11 +20,8 @@ impl SessionType { @@ -23,11 +20,8 @@ impl SessionType {
match self {
SessionType::Chat => 0,
SessionType::Group => 1,
SessionType::Files => 2,
SessionType::Device => 3,
SessionType::Assistant => 4,
SessionType::Domain => 5,
SessionType::Service => 6,
SessionType::Device => 2,
SessionType::Assistant => 3,
}
}
@ -35,11 +29,8 @@ impl SessionType { @@ -35,11 +29,8 @@ impl SessionType {
match i {
0 => SessionType::Chat,
1 => SessionType::Group,
2 => SessionType::Files,
3 => SessionType::Device,
4 => SessionType::Assistant,
5 => SessionType::Domain,
6 => SessionType::Service,
2 => SessionType::Device,
3 => SessionType::Assistant,
_ => SessionType::Chat,
}
}

Loading…
Cancel
Save