diff --git a/lib/apps/group_chat/detail.dart b/lib/apps/group_chat/detail.dart index 132c49f..10dabb7 100644 --- a/lib/apps/group_chat/detail.dart +++ b/lib/apps/group_chat/detail.dart @@ -330,7 +330,7 @@ class _GroupChatDetailState extends State { 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 { 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 { 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), diff --git a/lib/apps/group_chat/provider.dart b/lib/apps/group_chat/provider.dart index ff47a71..1b783fd 100644 --- a/lib/apps/group_chat/provider.dart +++ b/lib/apps/group_chat/provider.dart @@ -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(); diff --git a/lib/l10n/localizations.dart b/lib/l10n/localizations.dart index 9bbae17..7891a15 100644 --- a/lib/l10n/localizations.dart +++ b/lib/l10n/localizations.dart @@ -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; diff --git a/lib/l10n/localizations_en.dart b/lib/l10n/localizations_en.dart index 8e2c3a1..6ad2525 100644 --- a/lib/l10n/localizations_en.dart +++ b/lib/l10n/localizations_en.dart @@ -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 diff --git a/lib/l10n/localizations_zh.dart b/lib/l10n/localizations_zh.dart index aa86a01..c31567a 100644 --- a/lib/l10n/localizations_zh.dart +++ b/lib/l10n/localizations_zh.dart @@ -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 diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 8708a5c..d95cd4c 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -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( diff --git a/lib/session.dart b/lib/session.dart index c119e84..871d5a4 100644 --- a/lib/session.dart +++ b/lib/session.dart @@ -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]; diff --git a/src/apps/chat/layer.rs b/src/apps/chat/layer.rs index d12c1e6..b86b3f7 100644 --- a/src/apps/chat/layer.rs +++ b/src/apps/chat/layer.rs @@ -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 { &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 { 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 { 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)) } } diff --git a/src/apps/chat/models.rs b/src/apps/chat/models.rs index a856638..1c31323 100644 --- a/src/apps/chat/models.rs +++ b/src/apps/chat/models.rs @@ -64,7 +64,7 @@ impl NetworkMessage { db: &DStorage, fid: i64, hash: EventId, - ) -> Result { + ) -> Result<(Message, String)> { // handle event. let (m_type, raw) = match self { NetworkMessage::String(content) => (MessageType::String, content), @@ -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 { diff --git a/src/apps/chat/rpc.rs b/src/apps/chat/rpc.rs index 10a2694..8d0e6b6 100644 --- a/src/apps/chat/rpc.rs +++ b/src/apps/chat/rpc.rs @@ -423,7 +423,8 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { 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) { &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)); } diff --git a/src/apps/group_chat/layer.rs b/src/apps/group_chat/layer.rs index 67313e4..edf1258 100644 --- a/src/apps/group_chat/layer.rs +++ b/src/apps/group_chat/layer.rs @@ -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( 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( 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( &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( // 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 => {} diff --git a/src/apps/group_chat/models.rs b/src/apps/group_chat/models.rs index ba69b19..37fcdeb 100644 --- a/src/apps/group_chat/models.rs +++ b/src/apps/group_chat/models.rs @@ -829,7 +829,7 @@ pub(super) fn from_network_message( msg: NetworkMessage, datetime: i64, base: &PathBuf, -) -> Result { +) -> 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( (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)) } diff --git a/src/apps/group_chat/rpc.rs b/src/apps/group_chat/rpc.rs index f0411ee..552d753 100644 --- a/src/apps/group_chat/rpc.rs +++ b/src/apps/group_chat/rpc.rs @@ -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 { } #[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) { } } - let (msg, nw) = crate::apps::chat::LayerEvent::from_message( + let (msg, nw, _) = crate::apps::chat::LayerEvent::from_message( &base, gid, fid, diff --git a/src/event.rs b/src/event.rs index 8b0dee9..91c2153 100644 --- a/src/event.rs +++ b/src/event.rs @@ -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 { } 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 {