Browse Source

add new common message type: transfer

pull/18/head
Sun 4 years ago
parent
commit
fc7076daba
  1. 14
      lib/apps/primitives.dart
  2. 2
      lib/session.dart
  3. 26
      lib/widgets/chat_input.dart
  4. 40
      lib/widgets/transfer.dart
  5. 6
      src/apps/chat/models.rs
  6. 9
      src/apps/wallet/rpc.rs

14
lib/apps/primitives.dart

@ -65,6 +65,7 @@ enum MessageType { @@ -65,6 +65,7 @@ enum MessageType {
Phone,
Video,
Invite,
Transfer,
}
// use 00-99
@ -89,6 +90,8 @@ extension MessageTypeExtension on MessageType { @@ -89,6 +90,8 @@ extension MessageTypeExtension on MessageType {
return 7;
case MessageType.Invite:
return 8;
case MessageType.Transfer:
return 9;
default:
return 0;
}
@ -114,6 +117,8 @@ extension MessageTypeExtension on MessageType { @@ -114,6 +117,8 @@ extension MessageTypeExtension on MessageType {
return MessageType.Video;
case 8:
return MessageType.Invite;
case 8:
return MessageType.Transfer;
default:
return MessageType.String;
}
@ -193,6 +198,15 @@ class BaseMessage { @@ -193,6 +198,15 @@ class BaseMessage {
return [type, gid, addr, name, proof, key];
}
// [hash, to, amount, name]
List<String> showTransfer() {
return this.content.split(";");
}
static String mergeTransfer(String hash, String to, String amount, String name) {
return "${hash};${to};${amount};${name}";
}
static String rawRecordName(int time, String name) {
return time.toString() + '-' + name;
}

2
lib/session.dart

@ -115,6 +115,8 @@ class Session { @@ -115,6 +115,8 @@ class Session {
return "[${lang.others}]";
case MessageType.Invite:
return "[${lang.invite}]";
case MessageType.Transfer:
return "[${lang.transfer}]";
}
}

26
lib/widgets/chat_input.dart

@ -130,11 +130,13 @@ class ChatInputState extends State<ChatInput> { @@ -130,11 +130,13 @@ class ChatInputState extends State<ChatInput> {
_tokenCallback(String hash, String to, String amount, String name) {
_restore();
//widget.callback(MessageType.Transfer, "");
widget.callback(
MessageType.Transfer,
BaseMessage.mergeTransfer(hash, to, amount, name)
);
}
void _transfer(ColorScheme color, AppLocalizations lang) {
return;
showShadowDialog(
context,
Icons.paid,
@ -279,18 +281,21 @@ class ChatInputState extends State<ChatInput> { @@ -279,18 +281,21 @@ class ChatInputState extends State<ChatInput> {
alignment: WrapAlignment.center,
children: <Widget>[
_ExtensionButton(
enable: true,
icon: Icons.image_rounded,
text: lang.album,
action: _image,
bgColor: color.surface,
iconColor: color.primary),
_ExtensionButton(
enable: true,
icon: Icons.folder_rounded,
text: lang.file,
action: _file,
bgColor: color.surface,
iconColor: color.primary),
_ExtensionButton(
enable: true,
icon: Icons.person_rounded,
text: lang.contact,
action: () => _contact(color, lang),
@ -298,11 +303,12 @@ class ChatInputState extends State<ChatInput> { @@ -298,11 +303,12 @@ class ChatInputState extends State<ChatInput> {
iconColor: color.primary),
if (widget.hasTransfer)
_ExtensionButton(
icon: Icons.paid_rounded,
text: lang.transfer,
action: () => _transfer(color, lang),
bgColor: color.surface,
iconColor: color.primary),
enable: widget.transferTo.length > 2,
icon: Icons.paid_rounded,
text: lang.transfer,
action: () => _transfer(color, lang),
bgColor: color.surface,
iconColor: color.primary),
],
),
)
@ -341,6 +347,7 @@ class ChatInputState extends State<ChatInput> { @@ -341,6 +347,7 @@ class ChatInputState extends State<ChatInput> {
}
class _ExtensionButton extends StatelessWidget {
final bool enable;
final String text;
final IconData icon;
final VoidCallback action;
@ -354,12 +361,13 @@ class _ExtensionButton extends StatelessWidget { @@ -354,12 +361,13 @@ class _ExtensionButton extends StatelessWidget {
required this.action,
required this.bgColor,
required this.iconColor,
required this.enable,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: action,
onTap: enable ? action : null,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
@ -370,7 +378,7 @@ class _ExtensionButton extends StatelessWidget { @@ -370,7 +378,7 @@ class _ExtensionButton extends StatelessWidget {
color: bgColor,
borderRadius: BorderRadius.circular(15.0),
),
child: Icon(icon, color: iconColor, size: 36.0)),
child: Icon(icon, color: enable ? iconColor : Colors.grey, size: 36.0)),
SizedBox(height: 5.0),
Text(text, style: TextStyle(fontSize: 14.0)),
],

40
lib/widgets/transfer.dart

@ -42,6 +42,10 @@ class _TransferState extends State<Transfer> { @@ -42,6 +42,10 @@ class _TransferState extends State<Transfer> {
String _gas = '0';
String _networkError = '';
Map<ChainToken, String> _mains = {};
String _main = '';
ChainToken _mainChain = ChainToken.ETH;
@override
initState() {
rpc.addListener('wallet-token', _walletToken);
@ -54,6 +58,23 @@ class _TransferState extends State<Transfer> { @@ -54,6 +58,23 @@ class _TransferState extends State<Transfer> {
});
super.initState();
_loadWallet();
_split_address(widget.to);
}
_split_address(String s) {
print(s);
if (s.length > 0) {
s.split(",").forEach((ss) {
final sss = ss.split(":");
this._mains[ChainTokenExtension.fromInt(int.parse(sss[0]))] = sss[1];
});
if (this._mains.length == 0) {
Navigator.of(context).pop();
}
this._mainChain = ChainToken.ETH;
this._main = this._mains[ChainToken.ETH]!;
setState(() {});
}
}
_walletToken(List params) {
@ -93,7 +114,7 @@ class _TransferState extends State<Transfer> { @@ -93,7 +114,7 @@ class _TransferState extends State<Transfer> {
res.params.forEach((param) {
final address = Address.fromList(param);
this._addresses.add(address);
if (address.isMain) {
if (address.isMain && this._mainChain == address.chain) {
_changeAddress(address);
}
});
@ -104,6 +125,11 @@ class _TransferState extends State<Transfer> { @@ -104,6 +125,11 @@ class _TransferState extends State<Transfer> {
}
_changeAddress(Address address) {
if (!this._mains.containsKey(address.chain)) {
return;
}
this._main = this._mains[address.chain]!;
this._mainChain = address.chain;
this._selectedAddress = address;
this._networks = address.networks();
if (!this._networks.contains(this._selectedNetwork)) {
@ -126,9 +152,12 @@ class _TransferState extends State<Transfer> { @@ -126,9 +152,12 @@ class _TransferState extends State<Transfer> {
}
_gasPrice(String amount) async {
if (this._main.length < 2) {
return;
}
final res = await httpPost('wallet-gas-price', [
this._selectedToken.chain.toInt(), this._selectedNetwork.toInt(),
this._selectedAddress!.address, widget.to, amount,
this._selectedAddress!.address, this._main, amount,
this._selectedToken.contract
]);
if (res.isOk) {
@ -166,7 +195,7 @@ class _TransferState extends State<Transfer> { @@ -166,7 +195,7 @@ class _TransferState extends State<Transfer> {
return Column(
children: [
Text('-> ' + widget.to, style: TextStyle(color: color.primary)),
Text(this._main, style: TextStyle(color: color.primary)),
const SizedBox(height: 10.0),
Row(
children: [
@ -303,10 +332,13 @@ class _TransferState extends State<Transfer> { @@ -303,10 +332,13 @@ class _TransferState extends State<Transfer> {
PinWords(
gid: gid,
callback: (key) async {
if (this._main.length < 2) {
return;
}
Navigator.of(context).pop();
final res = await httpPost('wallet-transfer', [
this._selectedToken.chain.toInt(), this._selectedNetwork.toInt(),
this._selectedAddress!.id, widget.to, amount,
this._selectedAddress!.id, this._main, amount,
this._selectedToken.contract, key,
]);
if (res.isOk) {

6
src/apps/chat/models.rs

@ -29,6 +29,7 @@ pub(crate) fn from_network_message( @@ -29,6 +29,7 @@ pub(crate) fn from_network_message(
) -> Result<(MessageType, String)> {
match nmsg {
NetworkMessage::String(content) => Ok((MessageType::String, content)),
NetworkMessage::Transfer(content) => Ok((MessageType::Transfer, content)),
NetworkMessage::Image(bytes) => {
let image_name = write_image_sync(base, ogid, bytes)?;
Ok((MessageType::Image, image_name))
@ -153,6 +154,10 @@ pub(crate) async fn raw_to_network_message( @@ -153,6 +154,10 @@ pub(crate) async fn raw_to_network_message(
NetworkMessage::Invite(content.to_owned()),
content.to_owned(),
)),
MessageType::Transfer => Ok((
NetworkMessage::Transfer(content.to_owned()),
content.to_owned(),
)),
}
}
@ -195,6 +200,7 @@ pub(crate) async fn to_network_message( @@ -195,6 +200,7 @@ pub(crate) async fn to_network_message(
Ok(NetworkMessage::Record(bytes, time))
}
MessageType::Invite => Ok(NetworkMessage::Invite(content)),
MessageType::Transfer => Ok(NetworkMessage::Transfer(content)),
MessageType::Emoji => Ok(NetworkMessage::Emoji),
MessageType::Phone => Ok(NetworkMessage::Phone),
MessageType::Video => Ok(NetworkMessage::Video),

9
src/apps/wallet/rpc.rs

@ -372,6 +372,15 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { @@ -372,6 +372,15 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
};
address.insert(&db)?;
if address.main {
let mut group_lock = state.group.write().await;
let a_db = account_db(group_lock.base())?;
let account = group_lock.account_mut(&gid)?;
account.wallet = address.chain.update_main(&address.address, &account.wallet);
account.pub_height = account.pub_height + 1;
account.update_info(&a_db)?;
drop(group_lock);
}
Ok(HandleResult::rpc(address.to_rpc()))
},
);

Loading…
Cancel
Save