Browse Source

fix UI and join group chat

pull/18/head
Sun 4 years ago
parent
commit
91d5fdf5b8
  1. 9
      lib/apps/group_chat/detail.dart
  2. 1
      lib/apps/group_chat/provider.dart
  3. 3
      lib/l10n/localizations.dart
  4. 6
      lib/l10n/localizations_en.dart
  5. 6
      lib/l10n/localizations_zh.dart
  6. 2
      lib/pages/home.dart
  7. 36
      lib/session.dart
  8. 28
      src/apps/chat/layer.rs
  9. 26
      src/apps/chat/models.rs
  10. 9
      src/apps/chat/rpc.rs
  11. 28
      src/apps/group_chat/layer.rs
  12. 26
      src/apps/group_chat/models.rs
  13. 15
      src/apps/group_chat/rpc.rs
  14. 4
      src/event.rs

9
lib/apps/group_chat/detail.dart

@ -330,7 +330,7 @@ class _GroupChatDetailState extends State<GroupChatDetail> { @@ -330,7 +330,7 @@ class _GroupChatDetailState extends State<GroupChatDetail> {
const Divider(height: 1.0, color: Color(0x40ADB0BB)),
Expanded(
child: ListView.builder(
padding: EdgeInsets.symmetric(horizontal: 20.0),
padding: EdgeInsets.symmetric(horizontal: 10.0),
itemCount: recentMessageKeys.length,
reverse: true,
itemBuilder: (BuildContext context, index) {
@ -634,7 +634,7 @@ class _MemberDrawerWidget extends StatelessWidget { @@ -634,7 +634,7 @@ class _MemberDrawerWidget extends StatelessWidget {
child: SafeArea(
child: Container(
decoration: BoxDecoration(color: color.surface),
padding: const EdgeInsets.symmetric(vertical: 20.0),
padding: const EdgeInsets.symmetric(vertical: 10.0),
child: Column(
children: [
Row(
@ -646,15 +646,16 @@ class _MemberDrawerWidget extends StatelessWidget { @@ -646,15 +646,16 @@ class _MemberDrawerWidget extends StatelessWidget {
style: Theme.of(context).textTheme.title),
),
Container(
height: 36.0,
margin: const EdgeInsets.only(right: 10.0),
padding: const EdgeInsets.symmetric(vertical: 2.0, horizontal: 10.0),
padding: const EdgeInsets.symmetric(horizontal: 8.0),
decoration: BoxDecoration(
border: Border.all(color: Color(0xFF6174FF)),
borderRadius: BorderRadius.circular(25.0)),
child: TextButton(child: Row(
children: [
Icon(Icons.add, size: 16.0),
Text(lang.invite),
Text(lang.invite, style: TextStyle(fontSize: 14.0)),
]
),
onPressed: () => _invite(context, lang.contact),

1
lib/apps/group_chat/provider.dart

@ -229,6 +229,7 @@ class GroupChatProvider extends ChangeNotifier { @@ -229,6 +229,7 @@ class GroupChatProvider extends ChangeNotifier {
_requestHandle(List params) {
final id = params[0];
final ok = params[1];
final _efficacy = params[2];
if (this.requests.containsKey(id)) {
this.requests[id].overIt(ok);
notifyListeners();

3
lib/l10n/localizations.dart

@ -87,6 +87,9 @@ abstract class AppLocalizations { @@ -87,6 +87,9 @@ abstract class AppLocalizations {
String get block;
String get blocked;
String get invite;
String get emoji;
String get record;
String get others;
// theme
String get themeDark;

6
lib/l10n/localizations_en.dart

@ -98,6 +98,12 @@ class AppLocalizationsEn extends AppLocalizations { @@ -98,6 +98,12 @@ class AppLocalizationsEn extends AppLocalizations {
String get blocked => 'Blocked';
@override
String get invite => 'Invite';
@override
String get emoji => 'Emoji';
@override
String get record => 'Record';
@override
String get others => 'Others';
// theme
@override

6
lib/l10n/localizations_zh.dart

@ -98,6 +98,12 @@ class AppLocalizationsZh extends AppLocalizations { @@ -98,6 +98,12 @@ class AppLocalizationsZh extends AppLocalizations {
String get blocked => '已拉黑';
@override
String get invite => '邀请';
@override
String get emoji => '动画表情';
@override
String get record => '语音';
@override
String get others => '其他';
// theme
@override

2
lib/pages/home.dart

@ -513,7 +513,7 @@ class _SessionWidget extends StatelessWidget { @@ -513,7 +513,7 @@ class _SessionWidget extends StatelessWidget {
Container(
width: 45.0,
height: 45.0,
margin: const EdgeInsets.only(left: 20.0, right: 15.0),
margin: const EdgeInsets.only(left: 10.0, right: 12.0),
child: params[0],
),
Expanded(

36
lib/session.dart

@ -93,12 +93,44 @@ class Session { @@ -93,12 +93,44 @@ class Session {
return this.online == OnlineType.Active || this.online == OnlineType.Suspend;
}
String content(AppLocalizations lang) {
MessageType type = MessageType.String;
String raw = this.lastContent;
final i_type = this.lastContent.indexOf(':');
if (i_type > 0) {
type = MessageTypeExtension.fromInt(int.parse(this.lastContent.substring(0, i_type)));
raw = this.lastContent.substring(i_type + 1);
}
switch (type) {
case MessageType.String:
return raw;
case MessageType.Image:
return "[${lang.album}]";
case MessageType.File:
return "[${lang.file}]";
case MessageType.Contact:
return "[${lang.contactCard}]";
case MessageType.Emoji:
return "[${lang.emoji}]";
case MessageType.Record:
return "[${lang.record}]";
case MessageType.Phone:
return "[${lang.others}]";
case MessageType.Video:
return "[${lang.others}]";
case MessageType.Invite:
return "[${lang.invite}]";
}
}
List parse(AppLocalizations lang) {
switch (this.type) {
case SessionType.Chat:
return [showAvatar(), this.name, this.lastContent, this.lastTime.toString(), null];
return [showAvatar(), this.name, content(lang), this.lastTime.toString(), null];
case SessionType.Group:
return [showAvatar(), this.name, this.lastContent, this.lastTime.toString(), Icons.groups];
return [showAvatar(), this.name, content(lang), this.lastTime.toString(), Icons.groups];
case SessionType.Assistant:
final params = Session.innerService(InnerService.Assistant, lang);
return [params[0], params[1], params[2], '', Icons.campaign];

28
src/apps/chat/layer.rs

@ -300,7 +300,8 @@ impl LayerEvent { @@ -300,7 +300,8 @@ impl LayerEvent {
let (_sid, fid) = layer.get_running_remote_id(&mgid, &fgid)?;
let db = chat_db(&layer.base, &mgid)?;
if !Message::exist(&db, &hash)? {
let msg = m.clone().handle(false, mgid, &layer.base, &db, fid, hash)?;
let (msg, scontent) =
m.clone().handle(false, mgid, &layer.base, &db, fid, hash)?;
layer.group.write().await.broadcast(
&mgid,
InnerEvent::SessionMessageCreate(fgid, false, hash, m),
@ -317,21 +318,17 @@ impl LayerEvent { @@ -317,21 +318,17 @@ impl LayerEvent {
&fid,
&SessionType::Chat,
&msg.datetime,
&msg.content,
&scontent,
true,
) {
results.rpcs.push(session_last(
mgid,
&id,
&msg.datetime,
&msg.content,
false,
));
results
.rpcs
.push(session_last(mgid, &id, &msg.datetime, &scontent, false));
} else {
let c_db = chat_db(&layer.base, &mgid)?;
if let Some(f) = Friend::get_id(&c_db, fid)? {
let mut session = f.to_session();
session.last_content = msg.content;
session.last_content = scontent;
session.insert(&s_db)?;
results.rpcs.push(session_create(mgid, &session));
}
@ -389,7 +386,7 @@ impl LayerEvent { @@ -389,7 +386,7 @@ impl LayerEvent {
fid: i64,
m_type: MessageType,
content: String,
) -> std::result::Result<(Message, NetworkMessage), tdn::types::rpc::RpcError> {
) -> std::result::Result<(Message, NetworkMessage, String), tdn::types::rpc::RpcError> {
let db = chat_db(&base, &mgid)?;
// handle message's type.
@ -448,10 +445,17 @@ impl LayerEvent { @@ -448,10 +445,17 @@ impl LayerEvent {
MessageType::Invite => (NetworkMessage::Invite(content.clone()), content),
};
let scontent = match m_type {
MessageType::String => {
format!("{}:{}", m_type.to_int(), raw)
}
_ => format!("{}:", m_type.to_int()),
};
let mut msg = Message::new(&mgid, fid, true, m_type, raw, false);
msg.insert(&db)?;
drop(db);
Ok((msg, nm_type))
Ok((msg, nm_type, scontent))
}
}

26
src/apps/chat/models.rs

@ -64,7 +64,7 @@ impl NetworkMessage { @@ -64,7 +64,7 @@ impl NetworkMessage {
db: &DStorage,
fid: i64,
hash: EventId,
) -> Result<Message> {
) -> Result<(Message, String)> {
// handle event.
let (m_type, raw) = match self {
NetworkMessage::String(content) => (MessageType::String, content),
@ -100,21 +100,31 @@ impl NetworkMessage { @@ -100,21 +100,31 @@ impl NetworkMessage {
}
NetworkMessage::Invite(content) => (MessageType::Invite, content),
NetworkMessage::None => {
return Ok(Message::new_with_id(
hash,
fid,
is_me,
MessageType::String,
return Ok((
Message::new_with_id(
hash,
fid,
is_me,
MessageType::String,
"".to_owned(),
true,
),
"".to_owned(),
true,
));
}
};
let scontent = match m_type {
MessageType::String => {
format!("{}:{}", m_type.to_int(), raw)
}
_ => format!("{}:", m_type.to_int()),
};
let mut msg = Message::new_with_id(hash, fid, is_me, m_type, raw, true);
msg.insert(db)?;
Ok(msg)
Ok((msg, scontent))
}
pub fn from_model(base: &PathBuf, gid: &GroupId, model: Message) -> Result<NetworkMessage> {

9
src/apps/chat/rpc.rs

@ -423,7 +423,8 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { @@ -423,7 +423,8 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
let base = layer_lock.base();
let faddr = layer_lock.running(&gid)?.online(&fgid)?;
let (msg, nw) = LayerEvent::from_message(base, gid, fid, m_type, content).await?;
let (msg, nw, scontent) =
LayerEvent::from_message(base, gid, fid, m_type, content).await?;
let event = LayerEvent::Message(msg.hash, nw);
let s = super::layer::event_message(&mut layer_lock, msg.id, gid, faddr, &event);
drop(layer_lock);
@ -439,18 +440,18 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { @@ -439,18 +440,18 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
&fid,
&SessionType::Chat,
&msg.datetime,
&msg.content,
&scontent,
true,
) {
results
.rpcs
.push(session_last(gid, &id, &msg.datetime, &msg.content, true));
.push(session_last(gid, &id, &msg.datetime, &scontent, true));
} else {
let c_db = chat_db(&layer_lock.base, &gid)?;
let f = Friend::get_id(&c_db, fid)??;
let mut session =
Session::new(f.id, f.gid, f.addr, SessionType::Chat, f.name, f.datetime);
session.last_content = msg.content;
session.last_content = scontent;
session.insert(&s_db)?;
results.rpcs.push(session_create(gid, &session));
}

28
src/apps/group_chat/layer.rs

@ -179,7 +179,10 @@ async fn handle_event( @@ -179,7 +179,10 @@ async fn handle_event(
results.rpcs.push(session_create(mgid, &session));
// 3. update UI.
results.rpcs.push(rpc::group_agree(mgid, rid, group));
results
.rpcs
.push(rpc::request_handle(mgid, rid, true, false));
results.rpcs.push(rpc::group_create(mgid, group));
// 4. try connect.
let proof = layer
@ -195,7 +198,9 @@ async fn handle_event( @@ -195,7 +198,9 @@ async fn handle_event(
println!("Reject..........");
let db = group_chat_db(layer.read().await.base(), &mgid)?;
let (rid, _key) = Request::over(&db, &gcd, true)?;
results.rpcs.push(rpc::group_reject(mgid, rid, efficacy));
results
.rpcs
.push(rpc::request_handle(mgid, rid, false, efficacy));
}
LayerEvent::MemberOnline(gcd, mid, maddr) => {
let (_sid, gid) = layer.read().await.get_running_remote_id(&mgid, &gcd)?;
@ -240,7 +245,8 @@ async fn handle_event( @@ -240,7 +245,8 @@ async fn handle_event(
Event::MessageCreate(mid, nmsg, mtime) => {
println!("Sync: create message start");
let base = layer.read().await.base.clone();
let msg = from_network_message(height, gid, mid, &mgid, nmsg, mtime, &base)?;
let (msg, scontent) =
from_network_message(height, gid, mid, &mgid, nmsg, mtime, &base)?;
results.rpcs.push(rpc::message_create(mgid, &msg));
println!("Sync: create message ok");
@ -251,21 +257,17 @@ async fn handle_event( @@ -251,21 +257,17 @@ async fn handle_event(
&gid,
&SessionType::Group,
&msg.datetime,
&msg.content,
&scontent,
true,
) {
results.rpcs.push(session_last(
mgid,
&id,
&msg.datetime,
&msg.content,
false,
));
results
.rpcs
.push(session_last(mgid, &id, &msg.datetime, &scontent, false));
} else {
let c_db = group_chat_db(&base, &mgid)?;
if let Some(f) = GroupChat::get_id(&c_db, &gid)? {
let mut session = f.to_session();
session.last_content = msg.content;
session.last_content = scontent;
session.insert(&s_db)?;
results.rpcs.push(session_create(mgid, &session));
}
@ -408,7 +410,7 @@ fn handle_sync_event( @@ -408,7 +410,7 @@ fn handle_sync_event(
// TODO
}
PackedEvent::MessageCreate(mid, nmsg, time) => {
let msg = from_network_message(height, *fid, mid, mgid, nmsg, time, base)?;
let (msg, _) = from_network_message(height, *fid, mid, mgid, nmsg, time, base)?;
results.rpcs.push(rpc::message_create(*mgid, &msg));
}
PackedEvent::None => {}

26
src/apps/group_chat/models.rs

@ -829,7 +829,7 @@ pub(super) fn from_network_message( @@ -829,7 +829,7 @@ pub(super) fn from_network_message(
msg: NetworkMessage,
datetime: i64,
base: &PathBuf,
) -> Result<Message> {
) -> Result<(Message, String)> {
let db = group_chat_db(base, mgid)?;
let mdid = Member::get_ok(&db, &gdid, &mid)?;
let is_me = &mid == mgid;
@ -868,19 +868,29 @@ pub(super) fn from_network_message( @@ -868,19 +868,29 @@ pub(super) fn from_network_message(
(MessageType::Video, "".to_owned())
}
NetworkMessage::None => {
return Ok(Message::new(
height,
gdid,
mdid,
is_me,
MessageType::String,
return Ok((
Message::new(
height,
gdid,
mdid,
is_me,
MessageType::String,
"".to_owned(),
),
"".to_owned(),
));
}
};
let scontent = match m_type {
MessageType::String => {
format!("{}:{}", m_type.to_int(), raw)
}
_ => format!("{}:", m_type.to_int()),
};
let mut msg = Message::new_with_time(height, gdid, mdid, is_me, m_type, raw, datetime);
msg.insert(&db)?;
Ok(msg)
Ok((msg, scontent))
}

15
src/apps/group_chat/rpc.rs

@ -28,13 +28,8 @@ pub(crate) fn create_result(mgid: GroupId, gid: i64, ok: bool) -> RpcParam { @@ -28,13 +28,8 @@ pub(crate) fn create_result(mgid: GroupId, gid: i64, ok: bool) -> RpcParam {
}
#[inline]
pub(crate) fn group_agree(mgid: GroupId, rid: i64, group: GroupChat) -> RpcParam {
rpc_response(0, "group-chat-agree", json!([rid, group.to_rpc()]), mgid)
}
#[inline]
pub(crate) fn group_reject(mgid: GroupId, rid: i64, efficacy: bool) -> RpcParam {
rpc_response(0, "group-chat-reject", json!([rid, efficacy]), mgid)
pub(crate) fn group_create(mgid: GroupId, group: GroupChat) -> RpcParam {
rpc_response(0, "group-chat-create", json!(group.to_rpc()), mgid)
}
#[inline]
@ -43,8 +38,8 @@ pub(crate) fn request_create(mgid: GroupId, req: &Request) -> RpcParam { @@ -43,8 +38,8 @@ pub(crate) fn request_create(mgid: GroupId, req: &Request) -> RpcParam {
}
#[inline]
pub(crate) fn request_handle(mgid: GroupId, id: i64, ok: bool) -> RpcParam {
rpc_response(0, "group-chat-join-handle", json!([id, ok]), mgid)
pub(crate) fn request_handle(mgid: GroupId, id: i64, ok: bool, efficacy: bool) -> RpcParam {
rpc_response(0, "group-chat-join-handle", json!([id, ok, efficacy]), mgid)
}
#[inline]
@ -340,7 +335,7 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { @@ -340,7 +335,7 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
}
}
let (msg, nw) = crate::apps::chat::LayerEvent::from_message(
let (msg, nw, _) = crate::apps::chat::LayerEvent::from_message(
&base,
gid,
fid,

4
src/event.rs

@ -333,7 +333,7 @@ impl InnerEvent { @@ -333,7 +333,7 @@ impl InnerEvent {
.detach();
}
let msg = m.handle(is_me, gid, group.base(), &db, f.id, hash)?;
let (msg, _) = m.handle(is_me, gid, group.base(), &db, f.id, hash)?;
results.rpcs.push(chat_rpc::message_create(gid, &msg));
(MESSAGE_TABLE_PATH, msg.id)
} else {
@ -858,7 +858,7 @@ impl SyncEvent { @@ -858,7 +858,7 @@ impl SyncEvent {
}
let id = if let Some(f) = Friend::get_it(&chat_db, &fgid)? {
let msg = m.handle(is_me, gid, &base, &chat_db, f.id, eid)?;
let (msg, _) = m.handle(is_me, gid, &base, &chat_db, f.id, eid)?;
results.rpcs.push(chat_rpc::message_create(gid, &msg));
msg.id
} else {

Loading…
Cancel
Save