This commit is contained in:
zhutao
2025-11-21 18:21:47 +08:00
parent 9c94ee31fd
commit 5784a0a5d4
32 changed files with 734 additions and 441 deletions

View File

@@ -1,3 +1,6 @@
import 'dart:async';
import 'package:app/request/dto/room/room_info_dto.dart';
import 'package:app/request/dto/room/room_user_dto.dart';
import 'package:app/request/dto/room/rtc_token_dto.dart';
import 'package:app/request/websocket/room_protocol.dart';
@@ -7,18 +10,16 @@ import 'package:flutter/cupertino.dart';
import 'type.dart';
class StudentsViewModel extends ChangeNotifier {
StudentsViewModel({required this.roomId, String? start}) {
startTime = parseTime(start!);
class TchRoomVM extends ChangeNotifier {
TchRoomVM({required this.roomInfo, String? start}) {
_startRoom();
}
///
List<RoomUserDto> _students = [];
///id
final int roomId;
late final DateTime startTime;
///
final RoomInfoDto roomInfo;
///id
int activeSId = 0;
@@ -28,7 +29,7 @@ class StudentsViewModel extends ChangeNotifier {
///
bool get canEnterRoom {
final now = DateTime.now();
if (now.isAfter(startTime)) {
if (now.isAfter(parseTime(roomInfo.startTime))) {
return true;
}
return false;
@@ -36,6 +37,8 @@ class StudentsViewModel extends ChangeNotifier {
///websocket管理
final RoomWebSocket _ws = RoomWebSocket();
bool wsConnected = false; // socket连接状态
StreamSubscription<RoomMessage>? _sub;
RtcTokenDto? get rtcToken => _ws.rtcToken;
@@ -43,18 +46,16 @@ class StudentsViewModel extends ChangeNotifier {
void _startRoom() async {
//socket的token没有
if (_ws.wsToken.isEmpty) {
await _ws.initToken(roomId);
await _ws.initToken(roomInfo.id);
}
//
await _ws.connect();
//
_ws.send(RoomCommand.joinRoom);
wsConnected = true;
//ws事件
_ws.stream.listen((msg) {
_sub = _ws.stream.listen((msg) {
//
if (msg.event == RoomEvent.changeUser) {
final list = msg.data['user_list'].map((x) => RoomUserDto.fromJson(x)).toList();
final list = RoomUserDto.listFromJson(msg.data['user_list']);
onStudentChange(list);
} else if ([
RoomEvent.openSpeaker,
@@ -65,8 +66,7 @@ class StudentsViewModel extends ChangeNotifier {
RoomEvent.closeCamera,
RoomEvent.handUp,
].contains(msg.event)) {
onSyncStudentStatus();
//TODO
onSyncStudentItem(RoomUserDto.fromJson(msg.data));
}
});
notifyListeners();
@@ -91,29 +91,31 @@ class StudentsViewModel extends ChangeNotifier {
///
/// - [uId]: id
/// - [action]:
void closeStudentSpeaker({
void closeStudentAction({
required int uId,
required StudentAction action,
}) {
final student = _students.firstWhere((t) => t.userId == uId);
Map<String, int> data = {
Map<String, dynamic> data = {
'target_user_id': uId,
"mute_type": action.value,
};
//
if (action == StudentAction.speaker) {
student.speekerStatus = student.speekerStatus == 0 ? 1 : 0;
data['speeker'] = student.speekerStatus;
bool isOpen = student.speekerStatus == 1;
student.speekerStatus = isOpen ? 0 : 1;
data['is_mute'] = isOpen ? 1 : 0;
} else if (action == StudentAction.camera) {
//
if (student.cameraStatus == 0) return;
student.cameraStatus = 0;
data['camera'] = 0;
data['is_mute'] = 1;
} else if (action == StudentAction.microphone) {
//
if (student.microphoneStatus == 0) return;
student.microphoneStatus = 0;
data['microphone'] = 0;
data['is_mute'] = 1;
}
notifyListeners();
_ws.send(RoomCommand.switchStudentCamera, data);
@@ -143,13 +145,21 @@ class StudentsViewModel extends ChangeNotifier {
notifyListeners();
}
//TODO
void onSyncStudentStatus() {}
///
void onSyncStudentItem(RoomUserDto userInfo) {
final index = _students.indexWhere((t) => t.userId == userInfo.userId);
print(userInfo.toString());
if (index != -1) {
_students[index] = userInfo;
notifyListeners();
}
}
//
@override
void dispose() {
super.dispose();
_sub?.cancel();
_ws.dispose();
}
}

View File

@@ -1,11 +1,15 @@
///老师操作学生的状态、摄像头、扬声器、麦克风
enum StudentAction {
///摄像头
camera,
camera("camera"),
///麦克风
microphone,
microphone("microphone"),
///扬声器
speaker,
speaker("speeker");
final String value;
const StudentAction(this.value);
}