72 lines
2.3 KiB
TypeScript
72 lines
2.3 KiB
TypeScript
/* eslint-disable @typescript-eslint/member-ordering */
|
|
import { Component, inject, input } from '@angular/core';
|
|
import { CommonModule } from '@angular/common';
|
|
import { FormsModule } from '@angular/forms';
|
|
import { NgIcon, provideIcons } from '@ng-icons/core';
|
|
import { Store } from '@ngrx/store';
|
|
import { lucideUserX, lucideBan } from '@ng-icons/lucide';
|
|
|
|
import { Room, User } from '../../../../core/models';
|
|
import { UsersActions } from '../../../../store/users/users.actions';
|
|
import { WebRTCService } from '../../../../core/services/webrtc.service';
|
|
import { selectCurrentUser, selectOnlineUsers } from '../../../../store/users/users.selectors';
|
|
import { UserAvatarComponent } from '../../../../shared';
|
|
|
|
@Component({
|
|
selector: 'app-members-settings',
|
|
standalone: true,
|
|
imports: [CommonModule, FormsModule, NgIcon, UserAvatarComponent],
|
|
viewProviders: [
|
|
provideIcons({
|
|
lucideUserX,
|
|
lucideBan
|
|
})
|
|
],
|
|
templateUrl: './members-settings.component.html'
|
|
})
|
|
export class MembersSettingsComponent {
|
|
private store = inject(Store);
|
|
private webrtcService = inject(WebRTCService);
|
|
|
|
/** The currently selected server, passed from the parent. */
|
|
server = input<Room | null>(null);
|
|
/** Whether the current user is admin of this server. */
|
|
isAdmin = input(false);
|
|
|
|
currentUser = this.store.selectSignal(selectCurrentUser);
|
|
onlineUsers = this.store.selectSignal(selectOnlineUsers);
|
|
|
|
membersFiltered(): User[] {
|
|
const me = this.currentUser();
|
|
|
|
return this.onlineUsers().filter((user) => user.id !== me?.id && user.oderId !== me?.oderId);
|
|
}
|
|
|
|
changeRole(user: User, role: 'admin' | 'moderator' | 'member'): void {
|
|
this.store.dispatch(UsersActions.updateUserRole({ userId: user.id, role }));
|
|
this.webrtcService.broadcastMessage({
|
|
type: 'role-change',
|
|
targetUserId: user.id,
|
|
role
|
|
});
|
|
}
|
|
|
|
kickMember(user: User): void {
|
|
this.store.dispatch(UsersActions.kickUser({ userId: user.id }));
|
|
this.webrtcService.broadcastMessage({
|
|
type: 'kick',
|
|
targetUserId: user.id,
|
|
kickedBy: this.currentUser()?.id
|
|
});
|
|
}
|
|
|
|
banMember(user: User): void {
|
|
this.store.dispatch(UsersActions.banUser({ userId: user.id }));
|
|
this.webrtcService.broadcastMessage({
|
|
type: 'ban',
|
|
targetUserId: user.id,
|
|
bannedBy: this.currentUser()?.id
|
|
});
|
|
}
|
|
}
|