修复聊天重叠bug
This commit is contained in:
parent
219dfe59e2
commit
3f5dd9ddaf
@ -5,7 +5,8 @@
|
|||||||
import { router } from '@kit.ArkUI';
|
import { router } from '@kit.ArkUI';
|
||||||
import promptAction from '@ohos.promptAction';
|
import promptAction from '@ohos.promptAction';
|
||||||
import settingsService, { SettingsModel, TextResources } from '../common/SettingsService';
|
import settingsService, { SettingsModel, TextResources } from '../common/SettingsService';
|
||||||
import { ClassRoomService,
|
import {
|
||||||
|
ClassRoomService,
|
||||||
ClassSessionModel,
|
ClassSessionModel,
|
||||||
MessageModel,
|
MessageModel,
|
||||||
QuestionModel,
|
QuestionModel,
|
||||||
@ -21,8 +22,8 @@ import http from '@ohos.net.http';
|
|||||||
import hilog from '@ohos.hilog';
|
import hilog from '@ohos.hilog';
|
||||||
|
|
||||||
// 添加hilog和tianChannel常量
|
// 添加hilog和tianChannel常量
|
||||||
const TIAN_CHANNEL_DOMAIN_ID = 0x00201; // 自定义域ID
|
const TIAN_CHANNEL_DOMAIN_ID = 0x00201; // 自定义域ID
|
||||||
const TIAN_CHANNEL_TAG = 'tianChannel'; // 自定义TAG用于筛选日志
|
const TIAN_CHANNEL_TAG = 'tianChannel'; // 自定义TAG用于筛选日志
|
||||||
|
|
||||||
// 定义选项对象接口
|
// 定义选项对象接口
|
||||||
interface ScrollOptions {
|
interface ScrollOptions {
|
||||||
@ -89,59 +90,47 @@ enum ClassLiveMode {
|
|||||||
struct ClassLivePage {
|
struct ClassLivePage {
|
||||||
// 从路由参数获取模式
|
// 从路由参数获取模式
|
||||||
@State mode: ClassLiveMode = ClassLiveMode.STUDENT;
|
@State mode: ClassLiveMode = ClassLiveMode.STUDENT;
|
||||||
|
|
||||||
// 课堂会话
|
// 课堂会话
|
||||||
@State classSession: ClassSessionModel | null = null;
|
@State classSession: ClassSessionModel | null = null;
|
||||||
|
|
||||||
// 消息列表
|
// 消息列表
|
||||||
@State messages: MessageModel[] = [];
|
@State messages: MessageModel[] = [];
|
||||||
|
|
||||||
// 当前消息
|
// 当前消息
|
||||||
@State messageText: string = '';
|
@State messageText: string = '';
|
||||||
|
|
||||||
// 当前题目
|
// 当前题目
|
||||||
@State currentQuestion: QuestionModel | null = null;
|
@State currentQuestion: QuestionModel | null = null;
|
||||||
|
|
||||||
// 学生已选答案
|
// 学生已选答案
|
||||||
@State selectedOption: number = -1;
|
@State selectedOption: number = -1;
|
||||||
|
|
||||||
// 是否显示题目统计
|
// 是否显示题目统计
|
||||||
@State showQuestionStats: boolean = false;
|
@State showQuestionStats: boolean = false;
|
||||||
|
|
||||||
// 是否显示题目编辑器
|
// 是否显示题目编辑器
|
||||||
@State showQuestionEditor: boolean = false;
|
@State showQuestionEditor: boolean = false;
|
||||||
|
|
||||||
// 是否显示答题窗口
|
// 是否显示答题窗口
|
||||||
@State showAnswerDialog: boolean = false;
|
@State showAnswerDialog: boolean = false;
|
||||||
|
|
||||||
// 题目编辑相关状态
|
// 题目编辑相关状态
|
||||||
@State questionTitle: string = '';
|
@State questionTitle: string = '';
|
||||||
@State questionOptions: QuestionOption[] = [];
|
@State questionOptions: QuestionOption[] = [];
|
||||||
@State correctOption: number = 0;
|
@State correctOption: number = 0;
|
||||||
@State questionDuration: number = 30;
|
@State questionDuration: number = 30;
|
||||||
|
|
||||||
// 错误信息
|
// 错误信息
|
||||||
@State errorMessage: string = '';
|
@State errorMessage: string = '';
|
||||||
|
|
||||||
// 是否加载中
|
// 是否加载中
|
||||||
@State isLoading: boolean = false;
|
@State isLoading: boolean = false;
|
||||||
|
|
||||||
// 倒计时
|
// 倒计时
|
||||||
@State countdownSeconds: number = 0;
|
@State countdownSeconds: number = 0;
|
||||||
private countdownTimer: number = -1;
|
private countdownTimer: number = -1;
|
||||||
|
|
||||||
// 从设置服务获取设置
|
// 从设置服务获取设置
|
||||||
@State settings: SettingsModel = settingsService.getSettings();
|
@State settings: SettingsModel = settingsService.getSettings();
|
||||||
|
|
||||||
// 获取文本资源
|
// 获取文本资源
|
||||||
@State texts: TextResources = settingsService.getTextResources();
|
@State texts: TextResources = settingsService.getTextResources();
|
||||||
|
|
||||||
// 事件回调函数引用
|
// 事件回调函数引用
|
||||||
private messageCallback: (data: EventData) => void = () => {};
|
private messageCallback: (data: EventData) => void = () => {
|
||||||
private questionCallback: (data: EventData) => void = () => {};
|
};
|
||||||
private endQuestionCallback: (data: EventData) => void = () => {};
|
private questionCallback: (data: EventData) => void = () => {
|
||||||
private endClassCallback: (data: EventData) => void = () => {};
|
};
|
||||||
|
private endQuestionCallback: (data: EventData) => void = () => {
|
||||||
|
};
|
||||||
|
private endClassCallback: (data: EventData) => void = () => {
|
||||||
|
};
|
||||||
// 用于服务实例
|
// 用于服务实例
|
||||||
private classRoomService: ClassRoomService = ClassRoomService.getInstance();
|
private classRoomService: ClassRoomService = ClassRoomService.getInstance();
|
||||||
|
|
||||||
@ -640,7 +629,8 @@ struct ClassLivePage {
|
|||||||
// 只在失败时显示错误提示,成功时不跳转,等待服务器通知
|
// 只在失败时显示错误提示,成功时不跳转,等待服务器通知
|
||||||
const primaryButton: DialogButton = {
|
const primaryButton: DialogButton = {
|
||||||
value: '确定',
|
value: '确定',
|
||||||
action: () => {}
|
action: () => {
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const alertConfig: AlertDialogConfig = {
|
const alertConfig: AlertDialogConfig = {
|
||||||
@ -655,7 +645,8 @@ struct ClassLivePage {
|
|||||||
// 显示错误提示
|
// 显示错误提示
|
||||||
const primaryButton: DialogButton = {
|
const primaryButton: DialogButton = {
|
||||||
value: '确定',
|
value: '确定',
|
||||||
action: () => {}
|
action: () => {
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const alertConfig: AlertDialogConfig = {
|
const alertConfig: AlertDialogConfig = {
|
||||||
@ -745,7 +736,8 @@ struct ClassLivePage {
|
|||||||
|
|
||||||
const secondaryButton: DialogButton = {
|
const secondaryButton: DialogButton = {
|
||||||
value: '取消',
|
value: '取消',
|
||||||
action: () => {}
|
action: () => {
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const alertConfig: AlertDialogConfig = {
|
const alertConfig: AlertDialogConfig = {
|
||||||
@ -768,7 +760,8 @@ struct ClassLivePage {
|
|||||||
|
|
||||||
const secondaryButton: DialogButton = {
|
const secondaryButton: DialogButton = {
|
||||||
value: '取消',
|
value: '取消',
|
||||||
action: () => {}
|
action: () => {
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const alertConfig: AlertDialogConfig = {
|
const alertConfig: AlertDialogConfig = {
|
||||||
@ -813,7 +806,12 @@ struct ClassLivePage {
|
|||||||
.backgroundColor('rgba(255,255,255,0.2)')
|
.backgroundColor('rgba(255,255,255,0.2)')
|
||||||
.borderRadius(16)
|
.borderRadius(16)
|
||||||
.fontColor(Color.White)
|
.fontColor(Color.White)
|
||||||
.padding({ left: 12, right: 12, top: 6, bottom: 6 })
|
.padding({
|
||||||
|
left: 12,
|
||||||
|
right: 12,
|
||||||
|
top: 6,
|
||||||
|
bottom: 6
|
||||||
|
})
|
||||||
.margin({ right: 8 })
|
.margin({ right: 8 })
|
||||||
.onClick(() => {
|
.onClick(() => {
|
||||||
this.checkConnectionStatus();
|
this.checkConnectionStatus();
|
||||||
@ -827,7 +825,12 @@ struct ClassLivePage {
|
|||||||
.backgroundColor('rgba(255,255,255,0.2)')
|
.backgroundColor('rgba(255,255,255,0.2)')
|
||||||
.borderRadius(16)
|
.borderRadius(16)
|
||||||
.fontColor(Color.White)
|
.fontColor(Color.White)
|
||||||
.padding({ left: 12, right: 12, top: 6, bottom: 6 })
|
.padding({
|
||||||
|
left: 12,
|
||||||
|
right: 12,
|
||||||
|
top: 6,
|
||||||
|
bottom: 6
|
||||||
|
})
|
||||||
.onClick(() => {
|
.onClick(() => {
|
||||||
this.endClass();
|
this.endClass();
|
||||||
})
|
})
|
||||||
@ -893,10 +896,10 @@ struct ClassLivePage {
|
|||||||
|
|
||||||
// 聊天历史记录区域(可伸缩)
|
// 聊天历史记录区域(可伸缩)
|
||||||
Column() {
|
Column() {
|
||||||
Text("聊天记录")
|
// Text("聊天记录")
|
||||||
.fontSize(18)
|
// .fontSize(18)
|
||||||
.fontWeight(FontWeight.Bold)
|
// .fontWeight(FontWeight.Bold)
|
||||||
.margin({ bottom: 10 })
|
// .margin({ bottom: 10 })
|
||||||
|
|
||||||
List({ space: 8 }) {
|
List({ space: 8 }) {
|
||||||
ForEach(this.messages, (message: MessageModel, index) => {
|
ForEach(this.messages, (message: MessageModel, index) => {
|
||||||
@ -927,7 +930,8 @@ struct ClassLivePage {
|
|||||||
.fontSize(12)
|
.fontSize(12)
|
||||||
.fontColor('#999')
|
.fontColor('#999')
|
||||||
.margin({ top: 4 })
|
.margin({ top: 4 })
|
||||||
.alignSelf(message.senderId === settingsService.getCurrentAccount() ? ItemAlign.End : ItemAlign.Start)
|
.alignSelf(message.senderId === settingsService.getCurrentAccount() ? ItemAlign.End :
|
||||||
|
ItemAlign.Start)
|
||||||
}
|
}
|
||||||
.padding(12)
|
.padding(12)
|
||||||
.backgroundColor(message.senderRole === SenderRole.TEACHER ? '#e1f3d8' : '#edf2fc')
|
.backgroundColor(message.senderRole === SenderRole.TEACHER ? '#e1f3d8' : '#edf2fc')
|
||||||
@ -936,13 +940,14 @@ struct ClassLivePage {
|
|||||||
.width('85%')
|
.width('85%')
|
||||||
}
|
}
|
||||||
.width('100%')
|
.width('100%')
|
||||||
.justifyContent(message.senderId === settingsService.getCurrentAccount() ? FlexAlign.End : FlexAlign.Start)
|
.justifyContent(message.senderId === settingsService.getCurrentAccount() ? FlexAlign.End :
|
||||||
|
FlexAlign.Start)
|
||||||
.margin({ top: 4, bottom: 4 })
|
.margin({ top: 4, bottom: 4 })
|
||||||
}
|
}
|
||||||
}, (message: MessageModel) => message.id) // 使用消息ID作为唯一键,避免重复渲染
|
}, (message: MessageModel) => message.id) // 使用消息ID作为唯一键,避免重复渲染
|
||||||
}
|
}
|
||||||
.width('100%')
|
.width('100%')
|
||||||
.layoutWeight(1)
|
// .layoutWeight(1)
|
||||||
.padding(10)
|
.padding(10)
|
||||||
.backgroundColor('#f9f9f9')
|
.backgroundColor('#f9f9f9')
|
||||||
.borderRadius(8)
|
.borderRadius(8)
|
||||||
@ -1057,7 +1062,8 @@ struct ClassLivePage {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.mode === ClassLiveMode.STUDENT && this.currentQuestion && !this.showAnswerDialog && !this.showQuestionStats) {
|
if (this.mode === ClassLiveMode.STUDENT && this.currentQuestion && !this.showAnswerDialog &&
|
||||||
|
!this.showQuestionStats) {
|
||||||
Button({ type: ButtonType.Circle }) {
|
Button({ type: ButtonType.Circle }) {
|
||||||
Image($r('app.media.question'))
|
Image($r('app.media.question'))
|
||||||
.width(24)
|
.width(24)
|
||||||
@ -1474,7 +1480,8 @@ struct ClassLivePage {
|
|||||||
// 显示状态对话框
|
// 显示状态对话框
|
||||||
const primaryButton: DialogButton = {
|
const primaryButton: DialogButton = {
|
||||||
value: '确定',
|
value: '确定',
|
||||||
action: () => {}
|
action: () => {
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const secondaryButton: DialogButton = {
|
const secondaryButton: DialogButton = {
|
||||||
@ -1495,7 +1502,7 @@ struct ClassLivePage {
|
|||||||
|
|
||||||
// 记录日志
|
// 记录日志
|
||||||
logManager.info(LogCategory.CLASS, LogEventType.SYSTEM_INFO,
|
logManager.info(LogCategory.CLASS, LogEventType.SYSTEM_INFO,
|
||||||
`连接状态: ${connectionStatus}, 消息数量: ${messageCount}, 最新消息ID: ${lastMessageId}`);
|
`连接状态: ${connectionStatus}, 消息数量: ${messageCount}, 最新消息ID: ${lastMessageId}`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`检查连接状态出错: ${error}`);
|
console.error(`检查连接状态出错: ${error}`);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user