diff --git a/assets/logo/logo_chat.png b/assets/logo/logo_chat.png index d74cba9..48bf5dc 100644 Binary files a/assets/logo/logo_chat.png and b/assets/logo/logo_chat.png differ diff --git a/assets/logo/logo_group_chat.png b/assets/logo/logo_group_chat.png index 674e2d8..d74cba9 100644 Binary files a/assets/logo/logo_group_chat.png and b/assets/logo/logo_group_chat.png differ diff --git a/assets/logo/logo_organization.png b/assets/logo/logo_organization.png new file mode 100644 index 0000000..674e2d8 Binary files /dev/null and b/assets/logo/logo_organization.png differ diff --git a/assets/logo/logo_tether.pnga b/assets/logo/logo_tether.pnga deleted file mode 100644 index 6a7fce6..0000000 Binary files a/assets/logo/logo_tether.pnga and /dev/null differ diff --git a/lib/apps/organization/detail.dart b/lib/apps/organization/detail.dart new file mode 100644 index 0000000..c59840a --- /dev/null +++ b/lib/apps/organization/detail.dart @@ -0,0 +1,339 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'package:esse/utils/adaptive.dart'; +import 'package:esse/utils/better_print.dart'; +import 'package:esse/utils/pick_image.dart'; +import 'package:esse/utils/pick_file.dart'; +import 'package:esse/l10n/localizations.dart'; +import 'package:esse/widgets/emoji.dart'; +import 'package:esse/widgets/button_text.dart'; +import 'package:esse/widgets/input_text.dart'; +import 'package:esse/widgets/shadow_dialog.dart'; +import 'package:esse/widgets/audio_recorder.dart'; +import 'package:esse/widgets/show_contact.dart'; +import 'package:esse/global.dart'; +import 'package:esse/options.dart'; +import 'package:esse/rpc.dart'; + +class OrganizationDetail extends StatefulWidget { + const OrganizationDetail({Key? key}) : super(key: key); + + @override + _OrganizationDetailState createState() => _OrganizationDetailState(); +} + +class _OrganizationDetailState extends State { + final GlobalKey _scaffoldKey = GlobalKey(); + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + final reallyDesktop = isDisplayDesktop(context); + final color = Theme.of(context).colorScheme; + final lang = AppLocalizations.of(context); + final width = MediaQuery.of(context).size.width; + + bool isDesktop = true; + if (width - 520 < 500) { + isDesktop = false; + } + + return Scaffold( + key: _scaffoldKey, + drawer: _ChannelScreen(), + endDrawer: _MemberScreen(), + drawerScrimColor: const Color(0x26ADB0BB), + drawerEnableOpenDragGesture: false, + appBar: AppBar( + automaticallyImplyLeading: false, + leading: reallyDesktop ? null : IconButton(icon: Icon(Icons.arrow_back), + onPressed: () => Navigator.pop(context)), + title: Text('ESSE', maxLines: 1, overflow: TextOverflow.ellipsis), + bottom: isDesktop ? PreferredSize( + child: Container(color: const Color(0x40ADB0BB), height: 1.0), + preferredSize: Size.fromHeight(1.0)): null, + actions: [ + if (!isDesktop) + IconButton(icon: Text('#', + style: TextStyle(color: color.primary, fontSize: 20.0, fontWeight: FontWeight.bold)), + onPressed: () => _scaffoldKey.currentState!.openDrawer(), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: IconButton( + icon: Icon(Icons.people), + onPressed: () => _scaffoldKey.currentState!.openEndDrawer(), + ), + ) + ] + ), + body: Container( + alignment: Alignment.topCenter, + child: isDesktop + ? Row(children: [ + Expanded(child: _MainScreen()), + _ChannelScreen(), + ]) + : _MainScreen() + ) + ); + } +} + +class _MainScreen extends StatefulWidget { + _MainScreen({Key? key}) : super(key: key); + + @override + _MainScreenState createState() => _MainScreenState(); +} + +class _MainScreenState extends State<_MainScreen> { + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + final color = Theme.of(context).colorScheme; + final lang = AppLocalizations.of(context); + + return Column( + children: [ + Expanded( + child: ListView.builder( + padding: EdgeInsets.symmetric(horizontal: 20.0), + itemCount: 0, + reverse: true, + itemBuilder: (BuildContext context, index) { + return Container(); + } + )), + Container( + padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), + child: Row( + children: [ + GestureDetector( + onTap: () {}, + child: Container(width: 20.0, + child: Icon(Icons.mic_rounded, color: color.primary)), + ), + const SizedBox(width: 10.0), + Expanded( + child: Container( + height: 40, + decoration: BoxDecoration( + color: color.surface, + borderRadius: BorderRadius.circular(10.0), + ), + child: TextField( + //enabled: isOnline, + style: TextStyle(fontSize: 14.0), + textInputAction: TextInputAction.send, + onChanged: (value) { + // + }, + //onSubmitted: (_v) => _sendMessage(), + decoration: InputDecoration( + hintText: 'Aa', + border: InputBorder.none, + contentPadding: EdgeInsets.only( + left: 15.0, right: 15.0, bottom: 7.0), + ), + //controller: textController, + //focusNode: textFocus, + ), + ), + ), + SizedBox(width: 10.0), + GestureDetector( + onTap: () {}, + child: Container(width: 20.0, + child: Icon(Icons.emoji_emotions_rounded, color: color.primary)), + ), + SizedBox(width: 10.0), + GestureDetector( + onTap: () {}, + child: Container(width: 20.0, + child: Icon(Icons.add_circle_rounded, color: color.primary)), + ), + ], + ), + ), + ] + ); + } +} + +class _ChannelScreen extends StatefulWidget { + _ChannelScreen({Key? key}) : super(key: key); + + @override + _ChannelScreenState createState() => _ChannelScreenState(); +} + +class Channel { + String name = ''; + bool public = true; + bool selected = false; + + Channel(this.name, [this.public=true]); +} + +class Category { + List channels = []; + String name = ''; + bool open = true; + + Category(this.channels, this.name); +} + +class _ChannelScreenState extends State<_ChannelScreen> { + List _categories = [ + Category([Channel('general'), Channel('esse'), Channel('privary', false)], 'common'), + Category([Channel('english'), Channel('中文', false)], 'language'), + Category([Channel('game'), Channel('social')], 'voice'), + ]; + + @override + void initState() { + super.initState(); + } + + Widget _channel(Channel channel, color) { + return Container( + margin: const EdgeInsets.symmetric(vertical: 2.0, horizontal: 10.0), + decoration: channel.selected ? BoxDecoration( + borderRadius: BorderRadius.circular(5.0), + color: Color(0x40ADB0BB) + ) : BoxDecoration(borderRadius: BorderRadius.circular(5.0)), + child: TextButton( + onPressed: () => setState(() { + this._categories.forEach((category) { + category.channels.forEach((channel) { + channel.selected = false; + }); + }); + channel.selected = true; + }), + child: Row( + children: [ + SizedBox( + width: 30.0, + height: 30.0, + child: Center( + child: channel.public + ? Text('#', style: TextStyle( + fontSize: 20.0, + color: channel.selected ? color.primary : Colors.grey + )) + : Icon(Icons.lock_rounded, size: 18.0, + color: channel.selected ? color.primary : Colors.grey + ), + )), + Expanded(child: Text(channel.name.toLowerCase(), style: TextStyle( + color: channel.selected ? color.primary : Colors.grey + ))), + ] + ), + ) + ); + } + + Widget _category(Category category, color) { + return Container( + padding: const EdgeInsets.only(right: 10.0, top: 10.0), + child: Row( + children: [ + TextButton( + style: TextButton.styleFrom(primary: color.onSurface.withOpacity(0.75)), + onPressed: () => setState(() => + category.open = !category.open, + ), + child: Row( + children: [ + Icon(category.open ? Icons.expand_more : Icons.expand_less, size: 16.0), + SizedBox( + width: 110.0, + child: Text( + category.name.toUpperCase(), maxLines: 1, overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + ) + ) + ] + )), + Spacer(), + SizedBox( + width: 40.0, + child: TextButton( + child: Icon(Icons.add, size: 18.0), + onPressed: () {} + )) + ])); + } + + @override + Widget build(BuildContext context) { + final color = Theme.of(context).colorScheme; + final lang = AppLocalizations.of(context); + + return SafeArea( + child: Container( + width: 200.0, + decoration: BoxDecoration(color: color.secondary), + child: ListView( + children: _categories.map((category) => + Column( + children: [ + _category(category, color), + category.open ? Column( + children: category.channels.map((channel) => + _channel(channel, color)).toList() + ) : Container(), + ] + ) + ).toList() + ) + )); + } +} + +class _MemberScreen extends StatefulWidget { + _MemberScreen({Key? key}) : super(key: key); + + @override + _MemberScreenState createState() => _MemberScreenState(); +} + +class _MemberScreenState extends State<_MemberScreen> { + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + final color = Theme.of(context).colorScheme; + final lang = AppLocalizations.of(context); + + return SafeArea( + child: Container( + width: 200.0, + decoration: BoxDecoration(color: color.secondary), + child: ListView( + children: [ + // + ListTile(title: Text('Sun')), + ListTile(title: Text('Sun')), + ListTile(title: Text('Sun')), + ListTile(title: Text('Sun')), + ] + ) + )); + } +} diff --git a/lib/apps/service/models.dart b/lib/apps/service/models.dart index 3c3e7e0..68471b8 100644 --- a/lib/apps/service/models.dart +++ b/lib/apps/service/models.dart @@ -7,11 +7,13 @@ import 'package:esse/apps/group_chat/list.dart'; import 'package:esse/apps/domain/page.dart'; import 'package:esse/apps/chat/list.dart'; import 'package:esse/apps/wallet/page.dart'; +import 'package:esse/apps/organization/detail.dart'; const List INNER_SERVICES = [ InnerService.Wallet, InnerService.Chat, InnerService.GroupChat, + InnerService.Organization, InnerService.Assistant, InnerService.Domain, //InnerService.Cloud, @@ -22,8 +24,9 @@ enum InnerService { GroupChat, Assistant, Domain, - Cloud, Wallet, + Organization, + Cloud, } extension InnerServiceExtension on InnerService { @@ -39,6 +42,8 @@ extension InnerServiceExtension on InnerService { return [lang.domain, lang.domainIntro, 'assets/logo/logo_domain.png']; case InnerService.Wallet: return [lang.wallet, lang.walletIntro, 'assets/logo/logo_wallet.png']; + case InnerService.Organization: + return [lang.organization, lang.organizationIntro, 'assets/logo/logo_organization.png']; case InnerService.Cloud: return [lang.cloud, lang.cloudIntro, 'assets/logo/logo_cloud.png']; } @@ -56,6 +61,8 @@ extension InnerServiceExtension on InnerService { return DomainDetail(); case InnerService.Wallet: return WalletDetail(); + case InnerService.Organization: + return OrganizationDetail(); case InnerService.Cloud: return DomainDetail(); } diff --git a/lib/l10n/localizations.dart b/lib/l10n/localizations.dart index 5531b81..a130013 100644 --- a/lib/l10n/localizations.dart +++ b/lib/l10n/localizations.dart @@ -271,6 +271,9 @@ abstract class AppLocalizations { String get main; String get setMain; String get transfer; + + String get organization; + String get organizationIntro; } class _AppLocalizationsDelegate diff --git a/lib/l10n/localizations_en.dart b/lib/l10n/localizations_en.dart index 5af4af8..11580ee 100644 --- a/lib/l10n/localizations_en.dart +++ b/lib/l10n/localizations_en.dart @@ -315,13 +315,13 @@ class AppLocalizationsEn extends AppLocalizations { @override String get assistantBio => 'Jarvis is a robot, only belongs to you'; @override - String get groupChat => 'Group Chat'; + String get groupChat => 'Group Chats'; @override String get groupChats => 'Groups'; @override String get groupChatAdd => 'Add Group'; @override - String get groupChatIntro => 'Multiple group chats'; + String get groupChatIntro => 'Temporary groups in local'; @override String get groupChatId => 'Group ID'; @override @@ -445,4 +445,9 @@ class AppLocalizationsEn extends AppLocalizations { String get setMain => 'Set to main'; @override String get transfer => 'Transfer'; + + @override + String get organization => 'Organization'; + @override + String get organizationIntro => 'DAO groups and channels'; } diff --git a/lib/l10n/localizations_zh.dart b/lib/l10n/localizations_zh.dart index d57e20b..01e516b 100644 --- a/lib/l10n/localizations_zh.dart +++ b/lib/l10n/localizations_zh.dart @@ -315,13 +315,13 @@ class AppLocalizationsZh extends AppLocalizations { @override String get assistantBio => 'Jarvis 是个机器人,只属于你'; @override - String get groupChat => '群聊'; + String get groupChat => '多人聊天'; @override - String get groupChats => '群聊'; + String get groupChats => '多人聊天'; @override String get groupChatAdd => '添加群聊'; @override - String get groupChatIntro => '各种各样的群聊'; + String get groupChatIntro => '本地临时的多人聊天'; @override String get groupChatId => '群ID'; @override @@ -445,4 +445,9 @@ class AppLocalizationsZh extends AppLocalizations { String get setMain => '设为主账户'; @override String get transfer => '转账'; + + @override + String get organization => '群组'; + @override + String get organizationIntro => '去中心化群聊与组织'; } diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 3c2f25a..2831132 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -67,7 +67,7 @@ class HomePage extends StatelessWidget { child: isDesktop ? Row(children: [ Container( - width: 350.0, + width: 320.0, decoration: BoxDecoration(color: colorScheme.secondary), child: HomeList() ), diff --git a/lib/pages/setting/network.dart b/lib/pages/setting/network.dart index f3fc310..b35b598 100644 --- a/lib/pages/setting/network.dart +++ b/lib/pages/setting/network.dart @@ -107,7 +107,9 @@ class _NetworkDetailState extends State { child: Container( padding: const EdgeInsets.all(20.0), child: Column( + crossAxisAlignment: CrossAxisAlignment.center, children: [ + Row(), Container( width: 600.0, padding: const EdgeInsets.all(20.0), @@ -175,6 +177,12 @@ class _NetworkDetailState extends State { _settingHead(lang.networkStable), Container( height: this.networkStable.length > 0 ? 100.0 : 50.0, + width: 600.0, + padding: const EdgeInsets.all(10.0), + decoration: BoxDecoration( + color: const Color(0x40ADB0BB), + borderRadius: BorderRadius.circular(15.0) + ), child: ListView.builder( itemCount: this.networkStable.length, itemBuilder: (context, index) { @@ -199,6 +207,12 @@ class _NetworkDetailState extends State { _settingHead(lang.networkDht), Container( height: this.networkDht.length > 0 ? 100.0 : 50.0, + width: 600.0, + padding: const EdgeInsets.all(10.0), + decoration: BoxDecoration( + color: const Color(0x40ADB0BB), + borderRadius: BorderRadius.circular(15.0) + ), child: ListView.builder( itemCount: this.networkDht.length, itemBuilder: (context, index) { diff --git a/pubspec.yaml b/pubspec.yaml index b85a111..b5ac9da 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -80,6 +80,7 @@ flutter: - assets/logo/logo_assistant.png - assets/logo/logo_group_chat.png - assets/logo/logo_domain.png + - assets/logo/logo_organization.png - assets/logo/logo_cloud.png - assets/logo/logo_wallet.png - assets/logo/logo_eth.png