import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_hbb/common.dart'; import 'package:flutter_hbb/consts.dart'; import 'package:flutter_hbb/models/peer_model.dart'; import '../../models/platform_model.dart'; class HttpType { static const kAuthReqTypeAccount = "account"; static const kAuthReqTypeMobile = "mobile"; static const kAuthReqTypeSMSCode = "sms_code"; static const kAuthReqTypeEmailCode = "email_code"; static const kAuthReqTypeTfaCode = "tfa_code"; static const kAuthResTypeToken = "access_token"; static const kAuthResTypeEmailCheck = "email_check"; static const kAuthResTypeTfaCheck = "tfa_check"; } enum UserStatus { kDisabled, kNormal, kUnverified } // to-do: The UserPayload does not contain all the fields of the user. // Is all the fields of the user needed? class UserPayload { String name = ''; String email = ''; String note = ''; UserStatus status; bool isAdmin = false; UserPayload.fromJson(Map json) : name = json['name'] ?? '', email = json['email'] ?? '', note = json['note'] ?? '', status = json['status'] == 0 ? UserStatus.kDisabled : json['status'] == -1 ? UserStatus.kUnverified : UserStatus.kNormal, isAdmin = json['is_admin'] == true; Map toJson() { final Map map = { 'name': name, 'status': status == UserStatus.kDisabled ? 0 : status == UserStatus.kUnverified ? -1 : 1, }; return map; } Map toGroupCacheJson() { final Map map = { 'name': name, }; return map; } } class PeerPayload { String id = ''; Map info = {}; int? status; String user = ''; String user_name = ''; String note = ''; PeerPayload.fromJson(Map json) : id = json['id'] ?? '', info = (json['info'] is Map) ? json['info'] : {}, status = json['status'], user = json['user'] ?? '', user_name = json['user_name'] ?? '', note = json['note'] ?? ''; static Peer toPeer(PeerPayload p) { return Peer.fromJson({ "id": p.id, 'loginName': p.user_name, "username": p.info['username'] ?? '', "platform": _platform(p.info['os']), "hostname": p.info['device_name'], }); } static String? _platform(dynamic field) { if (field == null) { return null; } final fieldStr = field.toString(); List list = fieldStr.split(' / '); if (list.isEmpty) return null; final os = list[0]; switch (os.toLowerCase()) { case 'windows': return kPeerPlatformWindows; case 'linux': return kPeerPlatformLinux; case 'macos': return kPeerPlatformMacOS; case 'android': return kPeerPlatformAndroid; default: if (fieldStr.toLowerCase().contains('linux')) { return kPeerPlatformLinux; } return null; } } } class LoginRequest { String? username; String? password; String? id; String? uuid; bool? autoLogin; String? type; String? verificationCode; String? tfaCode; String? secret; LoginRequest( {this.username, this.password, this.id, this.uuid, this.autoLogin, this.type, this.verificationCode, this.tfaCode, this.secret}); Map toJson() { final Map data = {}; if (username != null) data['username'] = username; if (password != null) data['password'] = password; if (id != null) data['id'] = id; if (uuid != null) data['uuid'] = uuid; if (autoLogin != null) data['autoLogin'] = autoLogin; if (type != null) data['type'] = type; if (verificationCode != null) { data['verificationCode'] = verificationCode; } if (tfaCode != null) data['tfaCode'] = tfaCode; if (secret != null) data['secret'] = secret; Map deviceInfo = {}; try { deviceInfo = jsonDecode(bind.mainGetLoginDeviceInfo()); } catch (e) { debugPrint('Failed to decode get device info: $e'); } data['deviceInfo'] = deviceInfo; return data; } } class LoginResponse { String? access_token; String? type; String? tfa_type; String? secret; UserPayload? user; LoginResponse( {this.access_token, this.type, this.tfa_type, this.secret, this.user}); LoginResponse.fromJson(Map json) { access_token = json['access_token']; type = json['type']; tfa_type = json['tfa_type']; secret = json['secret']; user = json['user'] != null ? UserPayload.fromJson(json['user']) : null; } } class RequestException implements Exception { int statusCode; String cause; RequestException(this.statusCode, this.cause); @override String toString() { return "RequestException, statusCode: $statusCode, error: $cause"; } } enum ShareRule { read(1), readWrite(2), fullControl(3); const ShareRule(this.value); final int value; static String desc(int v) { if (v == ShareRule.read.value) { return translate('Read-only'); } if (v == ShareRule.readWrite.value) { return translate('Read/Write'); } if (v == ShareRule.fullControl.value) { return translate('Full Control'); } return v.toString(); } static String shortDesc(int v) { if (v == ShareRule.read.value) { return 'R'; } if (v == ShareRule.readWrite.value) { return 'RW'; } if (v == ShareRule.fullControl.value) { return 'F'; } return v.toString(); } static ShareRule? fromValue(int v) { if (v == ShareRule.read.value) { return ShareRule.read; } if (v == ShareRule.readWrite.value) { return ShareRule.readWrite; } if (v == ShareRule.fullControl.value) { return ShareRule.fullControl; } return null; } } class AbProfile { String guid; String name; String owner; String? note; int rule; AbProfile(this.guid, this.name, this.owner, this.note, this.rule); AbProfile.fromJson(Map json) : guid = json['guid'] ?? '', name = json['name'] ?? '', owner = json['owner'] ?? '', note = json['note'] ?? '', rule = json['rule'] ?? 0; } class AbTag { String name; int color; AbTag(this.name, this.color); AbTag.fromJson(Map json) : name = json['name'] ?? '', color = json['color'] ?? ''; }