chatapp3-flutter/lib/shared/tools/sc_room_utils.dart
2026-04-16 19:23:54 +08:00

280 lines
8.9 KiB
Dart

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:yumi/shared/business_logic/models/res/login_res.dart';
import 'package:provider/provider.dart';
import 'package:yumi/app_localizations.dart';
import 'package:yumi/shared/data_sources/sources/local/data_persistence.dart';
import 'package:yumi/shared/data_sources/sources/local/user_manager.dart';
import 'package:yumi/modules/wallet/wallet_route.dart';
import 'package:yumi/modules/room/voice_room_route.dart';
import 'package:yumi/services/audio/rtc_manager.dart';
import 'package:yumi/services/auth/user_profile_manager.dart';
import 'package:yumi/ui_kit/components/sc_float_ichart.dart';
import 'package:yumi/ui_kit/components/text/sc_text.dart';
import 'package:yumi/ui_kit/components/sc_tts.dart';
import 'package:yumi/app/constants/sc_global_config.dart';
import 'package:yumi/app/routes/sc_fluro_navigator.dart';
import 'package:yumi/shared/tools/sc_lk_dialog_util.dart';
typedef SCRoomUtils = SCChatRoomHelper;
class SCChatRoomHelper {
static Map<String, SocialChatUserProfile> roomUsersMap = {};
static void goRoom(
String roomId,
BuildContext context, {
bool needOpenRedenvelope = false,
bool fromFloting = false,
String redPackId = "",
}) {
if (Provider.of<RealTimeCommunicationManager>(
context,
listen: false,
).currenRoom !=
null) {
if (SCFloatIchart().isShow()) {
///房间最小化了
if (Provider.of<RealTimeCommunicationManager>(
context,
listen: false,
).currenRoom?.roomProfile?.roomProfile?.id ==
roomId) {
SCRoomUtils.openCurrentRoom(
context,
needOpenRedenvelope: needOpenRedenvelope,
redPackId: redPackId,
);
} else {
showEnterRoomConfirm(
roomId,
context,
needOpenRedenvelope: needOpenRedenvelope,
fromFloting: fromFloting,
redPackId: redPackId,
);
}
} else {
if (Provider.of<RealTimeCommunicationManager>(
context,
listen: false,
).currenRoom?.roomProfile?.roomProfile?.id ==
roomId) {
} else {
showEnterRoomConfirm(
roomId,
context,
needOpenRedenvelope: needOpenRedenvelope,
fromFloting: fromFloting,
redPackId: redPackId,
);
}
}
} else {
showEnterRoomConfirm(
roomId,
context,
needOpenRedenvelope: needOpenRedenvelope,
fromFloting: fromFloting,
redPackId: redPackId,
);
}
}
static void openCurrentRoom(
BuildContext context, {
bool needOpenRedenvelope = false,
String? redPackId,
}) {
SCFloatIchart().remove();
Provider.of<RealTimeCommunicationManager>(
context,
listen: false,
).loadRoomInfo(
Provider.of<RealTimeCommunicationManager>(
context,
listen: false,
).currenRoom?.roomProfile?.roomProfile?.id ??
"",
);
Provider.of<SocialChatUserProfileManager>(
context,
listen: false,
).fetchUserProfileData();
Provider.of<RealTimeCommunicationManager>(
context,
listen: false,
).retrieveMicrophoneList();
Provider.of<RealTimeCommunicationManager>(context, listen: false)
.closeFullGame = true;
SCNavigatorUtils.push(
context,
'${VoiceRoomRoute.voiceRoom}?id=${Provider.of<RealTimeCommunicationManager>(context, listen: false).currenRoom?.roomProfile?.roomProfile?.id}',
);
}
static double getCurrenProgress(
int currentEnergy,
int maxEnergy,
double maxWidth,
) {
var progress = (currentEnergy / maxEnergy);
var curren = progress * maxWidth;
if (curren > maxWidth) {
return maxWidth;
} else {
return curren;
}
}
static void goRecharge(BuildContext context) {
SmartDialog.dismiss(tag: "showGoToRecharge");
SmartDialog.show(
tag: "showGoToRecharge",
alignment: Alignment.center,
animationType: SmartAnimationType.fade,
builder: (_) {
return Container(
width: ScreenUtil().screenWidth * 0.75,
height: 120.w,
padding: EdgeInsets.symmetric(horizontal: 10.w),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(12.w)),
),
child: Column(
children: [
SizedBox(height: 8.w),
Row(
children: [
Spacer(),
GestureDetector(
child: Icon(Icons.close, color: Colors.black, size: 20.w),
onTap: () {
SmartDialog.dismiss(tag: "showGoToRecharge");
},
),
SizedBox(width: 10.w),
],
),
Row(
children: [
Expanded(
child: text(
SCAppLocalizations.of(
context,
)!.insufhcientGoldsGoToRecharge,
textColor: Colors.black,
textAlign: TextAlign.center,
fontSize: 13.sp,
fontWeight: FontWeight.w600,
),
),
],
),
SizedBox(height: 10.w),
GestureDetector(
child: Container(
alignment: Alignment.center,
height: 38.w,
width: 125.w,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Color(0xFFFEB219), Color(0xFFFF9326)],
),
borderRadius: BorderRadius.all(Radius.circular(8.w)),
),
child: text(
SCAppLocalizations.of(context)!.goToRecharge,
textColor: Colors.white,
fontSize: 13.sp,
fontWeight: FontWeight.w600,
),
),
onTap: () {
closeAllDialogs();
SCNavigatorUtils.push(
context,
WalletRoute.recharge,
replace: false,
);
},
),
],
),
);
},
);
}
static int getRandomInt(int min, int max) {
final random = Random();
return min + random.nextInt(max - min + 1);
}
///房间游客是否可以发消息
static bool touristCanMsg(BuildContext context) {
///游客可以发送文字
if (Provider.of<RealTimeCommunicationManager>(
context,
listen: false,
).currenRoom?.roomProfile?.roomSetting?.touristMsg ??
false) {
} else {
if (Provider.of<RealTimeCommunicationManager>(
context,
listen: false,
).isTourists()) {
SCTts.show(SCAppLocalizations.of(context)!.touristsCannotSendMessages);
return false;
}
}
return true;
}
static void roomSCGlobalConfig(String roomId) {
final defaultEffectsEnabled = !SCGlobalConfig.isLowPerformanceDevice;
SCGlobalConfig
.isGiftSpecialEffects = SCGlobalConfig.clampVisualEffectPreference(
DataPersistence.getBool(
"${AccountStorage().getCurrentUser()?.userProfile?.account}-GiftSpecialEffects",
defaultValue: defaultEffectsEnabled,
),
);
SCGlobalConfig
.isEntryVehicleAnimation = SCGlobalConfig.clampVisualEffectPreference(
DataPersistence.getBool(
"${AccountStorage().getCurrentUser()?.userProfile?.account}-EntryVehicleAnimation",
defaultValue: defaultEffectsEnabled,
),
);
SCGlobalConfig
.isFloatingAnimationInGlobal = SCGlobalConfig.clampVisualEffectPreference(
DataPersistence.getBool(
"${AccountStorage().getCurrentUser()?.userProfile?.account}-FloatingAnimationInGlobal",
defaultValue: defaultEffectsEnabled,
),
);
SCGlobalConfig
.isLuckGiftSpecialEffects = SCGlobalConfig.clampVisualEffectPreference(
DataPersistence.getBool(
"${AccountStorage().getCurrentUser()?.userProfile?.account}-LuckGiftSpecialEffects",
defaultValue: defaultEffectsEnabled,
),
);
DataPersistence.setLastTimeRoomId(roomId);
}
static void closeAllDialogs() async {
// 循环检查并关闭弹窗,直到不存在任何弹窗
while (SmartDialog.checkExist(
dialogTypes: {SmartAllDialogType.custom, SmartAllDialogType.attach},
)) {
SmartDialog.dismiss();
await Future.delayed(const Duration(milliseconds: 50));
}
}
}