Browse Source

abstract chat message

pull/18/head
Sun 4 years ago
parent
commit
58d8b4541b
  1. 3
      lib/apps/chat/detail.dart
  2. 125
      lib/apps/chat/models.dart
  3. 1
      lib/apps/chat/provider.dart
  4. 19
      lib/apps/group_chat/add.dart
  5. 4
      lib/apps/group_chat/detail.dart
  6. 26
      lib/apps/group_chat/models.dart
  7. 3
      lib/apps/group_chat/provider.dart
  8. 123
      lib/apps/primitives.dart
  9. 5
      lib/widgets/chat_message.dart
  10. 20
      src/apps/group_chat/models.rs
  11. 1
      src/migrate/group_chat.rs

3
lib/apps/chat/detail.dart

@ -14,6 +14,7 @@ import 'package:esse/widgets/chat_message.dart'; @@ -14,6 +14,7 @@ import 'package:esse/widgets/chat_message.dart';
import 'package:esse/global.dart';
import 'package:esse/provider.dart';
import 'package:esse/apps/primitives.dart';
import 'package:esse/apps/chat/models.dart';
import 'package:esse/apps/chat/provider.dart';
@ -118,7 +119,7 @@ class _ChatDetailState extends State<ChatDetail> { @@ -118,7 +119,7 @@ class _ChatDetailState extends State<ChatDetail> {
}
void _sendRecord(int time) async {
final raw = Message.rawRecordName(time, _recordName);
final raw = BaseMessage.rawRecordName(time, _recordName);
context.read<ChatProvider>().messageCreate(Message(friend.id, MessageType.Record, raw));
setState(() {

125
lib/apps/chat/models.dart

@ -2,6 +2,8 @@ import 'package:esse/utils/relative_time.dart'; @@ -2,6 +2,8 @@ import 'package:esse/utils/relative_time.dart';
import 'package:esse/widgets/avatar.dart';
import 'package:esse/global.dart';
import 'package:esse/apps/primitives.dart';
class Friend {
int id;
String gid;
@ -112,127 +114,14 @@ class Request { @@ -112,127 +114,14 @@ class Request {
}
}
enum MessageType {
String,
Image,
File,
Contact,
Emoji,
Record,
Phone,
Video,
}
// use 00-99
extension MessageTypeExtension on MessageType {
int toInt() {
switch (this) {
case MessageType.String:
return 0;
case MessageType.Image:
return 1;
case MessageType.File:
return 2;
case MessageType.Contact:
return 3;
case MessageType.Emoji:
return 4;
case MessageType.Record:
return 5;
case MessageType.Phone:
return 6;
case MessageType.Video:
return 7;
default:
return 0;
}
}
static MessageType fromInt(int s) {
switch (s) {
case 0:
return MessageType.String;
case 1:
return MessageType.Image;
case 2:
return MessageType.File;
case 3:
return MessageType.Contact;
case 4:
return MessageType.Emoji;
case 5:
return MessageType.Record;
case 6:
return MessageType.Phone;
case 7:
return MessageType.Video;
default:
return MessageType.String;
}
}
}
class Message {
int id;
class Message extends BaseMessage {
String hash;
int fid;
bool isMe = true;
MessageType type;
String content;
bool isDelivery = false;
RelativeTime time = RelativeTime();
Message(this.fid, this.type, this.content);
List showContact() {
var name = '';
var did = '';
var addr = '';
var i_name = this.content.indexOf(';;');
if (i_name > 0) {
name = this.content.substring(0, i_name).replaceAll('-;', ';');
}
var raw = this.content.substring(i_name + 2);
var i_did = raw.indexOf(';;');
if (i_did > 0) {
did = raw.substring(0, i_did);
}
addr = raw.substring(i_did + 2);
return [name, did, addr, Global.avatarPath + did + '.png'];
}
static String rawRecordName(int time, String name) {
return time.toString() + '-' + name;
}
List showRecordTime() {
final len = this.content.indexOf('-');
if (len > 0) {
final time = int.parse(this.content.substring(0, len));
final path = this.content.substring(len + 1);
return [time, path];
} else {
return [0, this.content];
}
}
String shortShow() {
switch (this.type) {
case MessageType.Image:
return '[IMAGE]';
case MessageType.Record:
return '[RECORD]';
case MessageType.Phone:
return '[PHONE]';
case MessageType.Video:
return '[VIDEO]';
case MessageType.Contact:
return '[CONTACT CARD]';
default:
return this.content;
}
Message(int fid, MessageType type, String content) {
this.fid = fid;
this.type = type;
this.content = content;
}
Message.fromList(List params) {

1
lib/apps/chat/provider.dart

@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; @@ -6,6 +6,7 @@ import 'package:flutter/material.dart';
import 'package:esse/utils/relative_time.dart';
import 'package:esse/rpc.dart';
import 'package:esse/apps/primitives.dart';
import 'package:esse/apps/chat/models.dart';
import 'package:esse/apps/chat/detail.dart';

19
lib/apps/group_chat/add.dart

@ -16,8 +16,7 @@ import 'package:esse/widgets/qr_scan.dart'; @@ -16,8 +16,7 @@ import 'package:esse/widgets/qr_scan.dart';
import 'package:esse/global.dart';
import 'package:esse/provider.dart';
import 'package:esse/apps/chat/models.dart';
import 'package:esse/apps/chat/provider.dart';
import 'package:esse/apps/chat/models.dart' show Request; // TODO delete.
import 'package:esse/apps/group_chat/models.dart';
import 'package:esse/apps/group_chat/provider.dart';
@ -125,7 +124,7 @@ class _GroupAddPageState extends State<GroupAddPage> { @@ -125,7 +124,7 @@ class _GroupAddPageState extends State<GroupAddPage> {
var name = _joinNameController.text;
var remark = _joinRemarkController.text;
context.read<ChatProvider>().requestCreate(Request(id, addr, name, remark));
//context.read<GroupChatProvider>().requestCreate(Request(id, addr, name, remark));
setState(() {
_joinIdController.text = '';
_joinAddrController.text = '';
@ -204,7 +203,7 @@ class _GroupAddPageState extends State<GroupAddPage> { @@ -204,7 +203,7 @@ class _GroupAddPageState extends State<GroupAddPage> {
if (!isDesktop)
GestureDetector(
onTap: () {
context.read<ChatProvider>().requestClear();
//context.read<ChatProvider>().requestClear();
Navigator.pop(context);
},
child: Container(
@ -529,7 +528,7 @@ class _RequestItem extends StatelessWidget { @@ -529,7 +528,7 @@ class _RequestItem extends StatelessWidget {
InkWell(
onTap: () {
Navigator.pop(context);
Provider.of<ChatProvider>(context, listen: false).requestDelete(request.id);
//Provider.of<ChatProvider>(context, listen: false).requestDelete(request.id);
},
hoverColor: Colors.transparent,
child: Container(
@ -549,7 +548,7 @@ class _RequestItem extends StatelessWidget { @@ -549,7 +548,7 @@ class _RequestItem extends StatelessWidget {
InkWell(
onTap: () {
Navigator.pop(context);
Provider.of<ChatProvider>(context, listen: false).requestReject(request.id);
//Provider.of<ChatProvider>(context, listen: false).requestReject(request.id);
},
hoverColor: Colors.transparent,
child: Container(
@ -565,7 +564,7 @@ class _RequestItem extends StatelessWidget { @@ -565,7 +564,7 @@ class _RequestItem extends StatelessWidget {
InkWell(
onTap: () {
Navigator.pop(context);
Provider.of<ChatProvider>(context, listen: false).requestAgree(request.id);
//Provider.of<ChatProvider>(context, listen: false).requestAgree(request.id);
},
hoverColor: Colors.transparent,
child: Container(
@ -587,7 +586,7 @@ class _RequestItem extends StatelessWidget { @@ -587,7 +586,7 @@ class _RequestItem extends StatelessWidget {
InkWell(
onTap: () {
Navigator.pop(context);
Provider.of<ChatProvider>(context, listen: false).requestDelete(request.id);
//Provider.of<ChatProvider>(context, listen: false).requestDelete(request.id);
},
hoverColor: Colors.transparent,
child: Container(
@ -603,7 +602,7 @@ class _RequestItem extends StatelessWidget { @@ -603,7 +602,7 @@ class _RequestItem extends StatelessWidget {
InkWell(
onTap: () {
Navigator.pop(context);
Provider.of<ChatProvider>(context, listen: false).requestCreate(request);
//Provider.of<ChatProvider>(context, listen: false).requestCreate(request);
},
hoverColor: Colors.transparent,
child: Container(
@ -667,7 +666,7 @@ class _RequestItem extends StatelessWidget { @@ -667,7 +666,7 @@ class _RequestItem extends StatelessWidget {
)),
if (!request.over && !request.isMe)
InkWell(
onTap: () => context.read<ChatProvider>().requestAgree(request.id),
onTap: () => null, //context.read<ChatProvider>().requestAgree(request.id),
hoverColor: Colors.transparent,
child: Container(
height: 35.0,

4
lib/apps/group_chat/detail.dart

@ -14,8 +14,8 @@ import 'package:esse/widgets/chat_message.dart'; @@ -14,8 +14,8 @@ import 'package:esse/widgets/chat_message.dart';
import 'package:esse/global.dart';
import 'package:esse/provider.dart';
import 'package:esse/apps/primitives.dart';
import 'package:esse/apps/chat/provider.dart';
import 'package:esse/apps/chat/models.dart' show Message;
import 'package:esse/apps/group_chat/models.dart';
import 'package:esse/apps/group_chat/provider.dart';
@ -120,7 +120,7 @@ class _GroupChatDetailState extends State<GroupChatDetail> { @@ -120,7 +120,7 @@ class _GroupChatDetailState extends State<GroupChatDetail> {
}
void _sendRecord(int time) async {
final raw = Message.rawRecordName(time, _recordName);
final raw = BaseMessage.rawRecordName(time, _recordName);
//context.read<GroupChatProvider>().messageCreate(Message(group.id, MessageType.Record, raw));
setState(() {

26
lib/apps/group_chat/models.dart

@ -3,6 +3,8 @@ import 'package:esse/utils/relative_time.dart'; @@ -3,6 +3,8 @@ import 'package:esse/utils/relative_time.dart';
import 'package:esse/widgets/avatar.dart';
import 'package:esse/global.dart';
import 'package:esse/apps/primitives.dart';
enum GroupType {
Encrypted,
Common,
@ -119,3 +121,27 @@ class GroupChat { @@ -119,3 +121,27 @@ class GroupChat {
);
}
}
class Message extends BaseMessage {
int height;
int fid;
int mid;
Message(int fid, MessageType type, String content) {
this.fid = fid;
this.type = type;
this.content = content;
}
Message.fromList(List params) {
this.id = params[0];
this.height = params[1];
this.isMe = params[2];
this.fid = params[3];
this.mid = params[4];
this.type = MessageTypeExtension.fromInt(params[5]);
this.content = params[6];
this.isDelivery = params[7];
this.time = RelativeTime.fromInt(params[8]);
}
}

3
lib/apps/group_chat/provider.dart

@ -3,8 +3,9 @@ import "dart:collection"; @@ -3,8 +3,9 @@ import "dart:collection";
import 'package:flutter/material.dart';
import 'package:esse/rpc.dart';
import 'package:esse/apps/primitives.dart';
import 'package:esse/apps/group_chat/models.dart';
import 'package:esse/apps/chat/models.dart' show Message;
class GroupChatProvider extends ChangeNotifier {
List<GroupType> createSupported = [GroupType.Encrypted, GroupType.Common, GroupType.Open];

123
lib/apps/primitives.dart

@ -0,0 +1,123 @@ @@ -0,0 +1,123 @@
import 'package:esse/utils/relative_time.dart';
import 'package:esse/widgets/avatar.dart';
import 'package:esse/global.dart';
enum MessageType {
String,
Image,
File,
Contact,
Emoji,
Record,
Phone,
Video,
}
// use 00-99
extension MessageTypeExtension on MessageType {
int toInt() {
switch (this) {
case MessageType.String:
return 0;
case MessageType.Image:
return 1;
case MessageType.File:
return 2;
case MessageType.Contact:
return 3;
case MessageType.Emoji:
return 4;
case MessageType.Record:
return 5;
case MessageType.Phone:
return 6;
case MessageType.Video:
return 7;
default:
return 0;
}
}
static MessageType fromInt(int s) {
switch (s) {
case 0:
return MessageType.String;
case 1:
return MessageType.Image;
case 2:
return MessageType.File;
case 3:
return MessageType.Contact;
case 4:
return MessageType.Emoji;
case 5:
return MessageType.Record;
case 6:
return MessageType.Phone;
case 7:
return MessageType.Video;
default:
return MessageType.String;
}
}
}
class BaseMessage {
int id;
bool isMe = true;
MessageType type;
String content;
bool isDelivery = false;
RelativeTime time = RelativeTime();
List showContact() {
var name = '';
var did = '';
var addr = '';
var i_name = this.content.indexOf(';;');
if (i_name > 0) {
name = this.content.substring(0, i_name).replaceAll('-;', ';');
}
var raw = this.content.substring(i_name + 2);
var i_did = raw.indexOf(';;');
if (i_did > 0) {
did = raw.substring(0, i_did);
}
addr = raw.substring(i_did + 2);
return [name, did, addr, Global.avatarPath + did + '.png'];
}
static String rawRecordName(int time, String name) {
return time.toString() + '-' + name;
}
List showRecordTime() {
final len = this.content.indexOf('-');
if (len > 0) {
final time = int.parse(this.content.substring(0, len));
final path = this.content.substring(len + 1);
return [time, path];
} else {
return [0, this.content];
}
}
String shortShow() {
switch (this.type) {
case MessageType.Image:
return '[IMAGE]';
case MessageType.Record:
return '[RECORD]';
case MessageType.Phone:
return '[PHONE]';
case MessageType.Video:
return '[VIDEO]';
case MessageType.Contact:
return '[CONTACT CARD]';
default:
return this.content;
}
}
}

5
lib/widgets/chat_message.dart

@ -15,12 +15,13 @@ import 'package:esse/widgets/audio_player.dart'; @@ -15,12 +15,13 @@ import 'package:esse/widgets/audio_player.dart';
import 'package:esse/widgets/shadow_dialog.dart';
import 'package:esse/global.dart';
import 'package:esse/apps/chat/models.dart';
import 'package:esse/apps/primitives.dart';
import 'package:esse/apps/chat/models.dart' show Request;
import 'package:esse/apps/chat/provider.dart';
class ChatMessage extends StatelessWidget {
final String name;
final Message message;
final BaseMessage message;
const ChatMessage({Key key, this.name, this.message}): super(key: key);

20
src/apps/group_chat/models.rs

@ -8,6 +8,8 @@ use tdn::types::{ @@ -8,6 +8,8 @@ use tdn::types::{
};
use tdn_storage::local::{DStorage, DsValue};
use crate::apps::chat::MessageType;
pub(super) struct GroupChatKey(Vec<u8>);
impl GroupChatKey {
@ -262,28 +264,18 @@ pub(super) struct Member { @@ -262,28 +264,18 @@ pub(super) struct Member {
datetime: i64,
}
/// Group Chat message type.
pub(super) enum MessageType {
String,
Image,
File,
Contact,
Emoji,
Record,
Phone,
Video,
}
/// Group Chat Message Model.
pub(super) struct Message {
/// db auto-increment id.
id: i64,
/// group message consensus height.
height: i64,
/// message is mine.
is_me: bool,
/// group's db id.
fid: i64,
/// member's db id.
m_id: i64,
/// group message consensus height.
height: i64,
/// message type.
m_type: MessageType,
/// message content.

1
src/migrate/group_chat.rs

@ -42,6 +42,7 @@ pub(super) const GROUP_CHAT_VERSIONS: [&str; 4] = [ @@ -42,6 +42,7 @@ pub(super) const GROUP_CHAT_VERSIONS: [&str; 4] = [
fid INTEGER NOT NULL,
mid INTEGER NOT NULL,
height INTEGER NOT NULL,
is_me INTEGER NOT NULL,
m_type INTEGER NOT NULL,
content TEXT NOT NULL,
is_delivery INTEGER NOT NULL,

Loading…
Cancel
Save