Classroom uyarı mesajları eklendi.

This commit is contained in:
Sedat Öztürk 2025-08-31 22:47:41 +03:00
parent cba9bdf228
commit e042fc49bd
4 changed files with 30 additions and 1 deletions

View file

@ -423,7 +423,7 @@ public class ClassroomHub : Hub
.SendAsync("ForceDisconnect", "You have been removed from the class."); .SendAsync("ForceDisconnect", "You have been removed from the class.");
// 🔑 Mesajın clienta ulaşmasını bekle // 🔑 Mesajın clienta ulaşmasını bekle
await Task.Delay(200); await Task.Delay(300);
await Groups.RemoveFromGroupAsync(connectionId, sessionId.ToString()); await Groups.RemoveFromGroupAsync(connectionId, sessionId.ToString());
} }

View file

@ -1,3 +1,4 @@
import { toast } from '@/components/ui'
import { import {
ClassroomAttendanceDto, ClassroomAttendanceDto,
ClassroomChatDto, ClassroomChatDto,
@ -7,6 +8,7 @@ import {
import { ROUTES_ENUM } from '@/routes/route.constant' import { ROUTES_ENUM } from '@/routes/route.constant'
import { store } from '@/store/store' import { store } from '@/store/store'
import * as signalR from '@microsoft/signalr' import * as signalR from '@microsoft/signalr'
import Notification from '@/components/ui/Notification'
export class SignalRService { export class SignalRService {
private connection!: signalR.HubConnection private connection!: signalR.HubConnection
@ -101,6 +103,9 @@ export class SignalRService {
this.connection.onreconnected(async () => { this.connection.onreconnected(async () => {
this.isConnected = true this.isConnected = true
console.warn('🔄 SignalR reconnected') console.warn('🔄 SignalR reconnected')
toast.push(<Notification title="🔄 Bağlantı tekrar kuruldu" type="success" />, {
placement: 'top-center',
})
// Eğer sınıftayken bağlantı koptuysa → tekrar join et // Eğer sınıftayken bağlantı koptuysa → tekrar join et
if (this.currentSessionId && store.getState().auth.user) { if (this.currentSessionId && store.getState().auth.user) {
@ -113,6 +118,13 @@ export class SignalRService {
console.warn('🔥 onclose triggered, isKicked=', this.isKicked) console.warn('🔥 onclose triggered, isKicked=', this.isKicked)
if (this.isKicked) { if (this.isKicked) {
toast.push(
<Notification title="⚠️ Bağlantı koptu, yeniden bağlanılıyor..." type="warning" />,
{
placement: 'top-center',
},
)
this.isConnected = false this.isConnected = false
this.currentSessionId = undefined this.currentSessionId = undefined
return // ❗ Kick durumunda kesinlikle LeaveClass çağırma return // ❗ Kick durumunda kesinlikle LeaveClass çağırma
@ -132,6 +144,9 @@ export class SignalRService {
this.connection.on('Error', (message: string) => { this.connection.on('Error', (message: string) => {
console.error('Hub error:', message) console.error('Hub error:', message)
toast.push(<Notification title={`❌ Hata: ${message}`} type="danger" />, {
placement: 'top-center',
})
}) })
this.connection.onreconnecting((err) => { this.connection.onreconnecting((err) => {
@ -145,6 +160,9 @@ export class SignalRService {
this.connection.on('ForceDisconnect', async (message: string) => { this.connection.on('ForceDisconnect', async (message: string) => {
console.warn('🚨 ForceDisconnect geldi:', message) console.warn('🚨 ForceDisconnect geldi:', message)
this.isKicked = true this.isKicked = true
toast.push(<Notification title={`❌ Sınıftan çıkarıldınız: ${message}`} type="danger" />, {
placement: 'top-center',
})
if (this.onForceCleanup) { if (this.onForceCleanup) {
console.warn('⚡ ForceCleanup callback çağrılıyor') console.warn('⚡ ForceCleanup callback çağrılıyor')
@ -180,6 +198,9 @@ export class SignalRService {
await Promise.race([startPromise, timeout]) await Promise.race([startPromise, timeout])
this.isConnected = true this.isConnected = true
toast.push(<Notification title="✅ Bağlantı kuruldu" type="success" />, {
placement: 'top-center',
})
} catch (error) { } catch (error) {
console.error('Error starting SignalR connection:', error) console.error('Error starting SignalR connection:', error)
alert( alert(

View file

@ -55,6 +55,8 @@ import DocumentsPanel from '@/components/classroom/panels/DocumentsPanel'
import LayoutPanel from '@/components/classroom/panels/LayoutPanel' import LayoutPanel from '@/components/classroom/panels/LayoutPanel'
import { ScreenSharePanel } from '@/components/classroom/panels/ScreenSharePanel' import { ScreenSharePanel } from '@/components/classroom/panels/ScreenSharePanel'
import { ParticipantGrid } from '@/components/classroom/ParticipantGrid' import { ParticipantGrid } from '@/components/classroom/ParticipantGrid'
import toast from '@/components/ui/toast/toast'
import Notification from '@/components/ui/Notification'
type SidePanelType = type SidePanelType =
| 'chat' | 'chat'
@ -282,6 +284,9 @@ const RoomDetail: React.FC = () => {
if (!isActive) return if (!isActive) return
console.log(`Participant joined: ${name}, isTeacher: ${isTeacher}`) console.log(`Participant joined: ${name}, isTeacher: ${isTeacher}`)
toast.push(<Notification title={`${name} sınıfa katıldı`} type="success" />, {
placement: 'top-center',
})
// Statee ekle // Statee ekle
setParticipants((prev) => { setParticipants((prev) => {
@ -360,6 +365,9 @@ const RoomDetail: React.FC = () => {
signalRServiceRef.current.setParticipantLeaveHandler(({ userId, sessionId }) => { signalRServiceRef.current.setParticipantLeaveHandler(({ userId, sessionId }) => {
console.log(`Participant left: ${userId} from session ${sessionId}`) console.log(`Participant left: ${userId} from session ${sessionId}`)
toast.push(<Notification title={`Katılımcı ayrıldı: ${participants.find((p) => p.id === userId)?.name}`} type="warning" />, {
placement: 'top-center',
})
// peer connectionı kapat // peer connectionı kapat
webRTCServiceRef.current?.closePeerConnection(userId) webRTCServiceRef.current?.closePeerConnection(userId)