Files
chat/client/flutter/lib/models/group.dart
2026-04-25 16:36:34 +08:00

182 lines
4.3 KiB
Dart

class Group {
final String id;
final String name;
final String? avatar;
final String? description;
final String? owner;
final List<GroupMember> members;
final List<GroupPanel> panels;
final DateTime? createdAt;
final DateTime? updatedAt;
Group({
required this.id,
required this.name,
this.avatar,
this.description,
this.owner,
this.members = const [],
this.panels = const [],
this.createdAt,
this.updatedAt,
});
factory Group.fromJson(Map<String, dynamic> json) {
return Group(
id: (json['_id'] ?? json['id'] ?? '').toString(),
name: json['name'] ?? '',
avatar: json['avatar'],
description: json['description'],
owner: json['owner']?.toString(),
members: (json['members'] as List?)
?.map((e) => GroupMember.fromJson(e))
.toList() ??
[],
panels: (json['panels'] as List?)
?.map((e) => GroupPanel.fromJson(e))
.toList() ??
[],
createdAt: json['createdAt'] != null
? DateTime.parse(json['createdAt'].toString())
: null,
updatedAt: json['updatedAt'] != null
? DateTime.parse(json['updatedAt'].toString())
: null,
);
}
Map<String, dynamic> toJson() {
return {
'_id': id,
'name': name,
'avatar': avatar,
'description': description,
'owner': owner,
'members': members.map((e) => e.toJson()).toList(),
'panels': panels.map((e) => e.toJson()).toList(),
'createdAt': createdAt?.toIso8601String(),
'updatedAt': updatedAt?.toIso8601String(),
};
}
/// 群组成员数量
int get memberCount => members.length;
/// 获取第一个文本面板(频道)用于聊天
GroupPanel? get firstTextPanel {
try {
return panels.firstWhere((p) => p.type == 0);
} catch (_) {
return panels.isNotEmpty ? panels.first : null;
}
}
}
class GroupMember {
final String? userId;
final List<String>? roles;
final DateTime? muteUntil;
GroupMember({
this.userId,
this.roles,
this.muteUntil,
});
factory GroupMember.fromJson(Map<String, dynamic> json) {
return GroupMember(
userId: json['userId']?.toString(),
roles: (json['roles'] as List?)?.map((e) => e.toString()).toList(),
muteUntil: json['muteUntil'] != null
? DateTime.parse(json['muteUntil'].toString())
: null,
);
}
Map<String, dynamic> toJson() {
return {
'userId': userId,
'roles': roles,
'muteUntil': muteUntil?.toIso8601String(),
};
}
}
/// 群组面板类型:
/// 0 = 文本频道
/// 1 = 面板组(文件夹)
/// 2 = 插件面板
class GroupPanel {
final String id;
final String name;
final String? parentId;
final int type;
final String? provider;
final String? pluginPanelName;
final Map<String, dynamic>? meta;
GroupPanel({
required this.id,
required this.name,
this.parentId,
this.type = 0,
this.provider,
this.pluginPanelName,
this.meta,
});
factory GroupPanel.fromJson(Map<String, dynamic> json) {
return GroupPanel(
id: (json['id'] ?? '').toString(),
name: json['name'] ?? '',
parentId: json['parentId']?.toString(),
type: json['type'] ?? 0,
provider: json['provider'],
pluginPanelName: json['pluginPanelName'],
meta: json['meta'],
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'parentId': parentId,
'type': type,
'provider': provider,
'pluginPanelName': pluginPanelName,
'meta': meta,
};
}
}
/// getGroupBasicInfo 返回的基本群组信息
class GroupBasicInfo {
final String groupId;
final String name;
final String? avatar;
final String? description;
final int memberCount;
final String? backgroundImage;
GroupBasicInfo({
required this.groupId,
required this.name,
this.avatar,
this.description,
this.memberCount = 0,
this.backgroundImage,
});
factory GroupBasicInfo.fromJson(Map<String, dynamic> json) {
return GroupBasicInfo(
groupId: (json['groupId'] ?? '').toString(),
name: json['name'] ?? '',
avatar: json['avatar'],
description: json['description'],
memberCount: json['memberCount'] ?? 0,
backgroundImage: json['backgroundImage'],
);
}
}