mirror of
https://github.com/owncast/owncast.git
synced 2024-11-25 14:20:54 +03:00
Make testing for moderator state centralized in User class
This commit is contained in:
parent
e5dee5d258
commit
c4f057eded
6 changed files with 59 additions and 27 deletions
|
@ -17,6 +17,7 @@ import { ScrollToBotBtn } from './ScrollToBotBtn';
|
||||||
import { ChatActionMessage } from '../ChatActionMessage/ChatActionMessage';
|
import { ChatActionMessage } from '../ChatActionMessage/ChatActionMessage';
|
||||||
import { ChatSocialMessage } from '../ChatSocialMessage/ChatSocialMessage';
|
import { ChatSocialMessage } from '../ChatSocialMessage/ChatSocialMessage';
|
||||||
import { ChatNameChangeMessage } from '../ChatNameChangeMessage/ChatNameChangeMessage';
|
import { ChatNameChangeMessage } from '../ChatNameChangeMessage/ChatNameChangeMessage';
|
||||||
|
import { User } from '../../../interfaces/user.model';
|
||||||
|
|
||||||
export type ChatContainerProps = {
|
export type ChatContainerProps = {
|
||||||
messages: ChatMessage[];
|
messages: ChatMessage[];
|
||||||
|
@ -75,15 +76,11 @@ function shouldCollapseMessages(
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkIsModerator(message: ChatMessage | ConnectedClientInfoEvent) {
|
function checkIsModerator(message: ChatMessage | ConnectedClientInfoEvent) {
|
||||||
const {
|
const { user } = message;
|
||||||
user: { scopes },
|
|
||||||
} = message;
|
|
||||||
|
|
||||||
if (!scopes || scopes.length === 0) {
|
const u = new User(user);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return scopes.includes('MODERATOR');
|
return u.isModerator();
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ChatContainer: FC<ChatContainerProps> = ({
|
export const ChatContainer: FC<ChatContainerProps> = ({
|
||||||
|
|
|
@ -140,15 +140,3 @@ export function emojify(HTML, emojiList) {
|
||||||
}
|
}
|
||||||
return HTML;
|
return HTML;
|
||||||
}
|
}
|
||||||
|
|
||||||
// MODERATOR UTILS
|
|
||||||
export function checkIsModerator(message) {
|
|
||||||
const { user } = message;
|
|
||||||
const { scopes } = user;
|
|
||||||
|
|
||||||
if (!scopes || scopes.length === 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return scopes.includes('MODERATOR');
|
|
||||||
}
|
|
||||||
|
|
|
@ -292,13 +292,14 @@ export const ClientConfigStore: FC = () => {
|
||||||
setChatAuthenticated,
|
setChatAuthenticated,
|
||||||
setCurrentUser,
|
setCurrentUser,
|
||||||
);
|
);
|
||||||
if (
|
if (message as ChatEvent) {
|
||||||
!hasBeenModeratorNotified &&
|
const m = new ChatEvent(message);
|
||||||
(message as ChatEvent).user?.scopes.includes('MODERATOR')
|
if (!hasBeenModeratorNotified && m.user?.isModerator()) {
|
||||||
) {
|
|
||||||
setChatMessages(currentState => [...currentState, message as ChatEvent]);
|
setChatMessages(currentState => [...currentState, message as ChatEvent]);
|
||||||
hasBeenModeratorNotified = true;
|
hasBeenModeratorNotified = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case MessageType.CHAT:
|
case MessageType.CHAT:
|
||||||
setChatMessages(currentState => [...currentState, message as ChatEvent]);
|
setChatMessages(currentState => [...currentState, message as ChatEvent]);
|
||||||
|
|
|
@ -28,8 +28,25 @@ export interface SocketEvent {
|
||||||
export interface ConnectedClientInfoEvent extends SocketEvent {
|
export interface ConnectedClientInfoEvent extends SocketEvent {
|
||||||
user: User;
|
user: User;
|
||||||
}
|
}
|
||||||
export interface ChatEvent extends SocketEvent {
|
export class ChatEvent implements SocketEvent {
|
||||||
|
constructor(message) {
|
||||||
|
this.id = message.id;
|
||||||
|
this.timestamp = message.timestamp;
|
||||||
|
this.type = message.type;
|
||||||
|
this.body = message.body;
|
||||||
|
if (message.user) {
|
||||||
|
this.user = new User(message.user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
timestamp: Date;
|
||||||
|
|
||||||
|
type: MessageType;
|
||||||
|
|
||||||
|
id: string;
|
||||||
|
|
||||||
user: User;
|
user: User;
|
||||||
|
|
||||||
body: string;
|
body: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,8 @@ export const createUser = (name: string, color: number, createdAt: Date): User =
|
||||||
nameChangedAt: createdAt,
|
nameChangedAt: createdAt,
|
||||||
previousNames: [],
|
previousNames: [],
|
||||||
scopes: [],
|
scopes: [],
|
||||||
|
|
||||||
|
isModerator: () => false,
|
||||||
});
|
});
|
||||||
|
|
||||||
export const spidermanUser = createUser('Spiderman', 1, new Date(2020, 1, 2));
|
export const spidermanUser = createUser('Spiderman', 1, new Date(2020, 1, 2));
|
||||||
|
|
|
@ -1,10 +1,37 @@
|
||||||
export interface User {
|
/* eslint-disable import/prefer-default-export */
|
||||||
|
export class User {
|
||||||
|
constructor(u) {
|
||||||
|
this.id = u.id;
|
||||||
|
this.displayName = u.displayName;
|
||||||
|
this.displayColor = u.displayColor;
|
||||||
|
this.createdAt = u.createdAt;
|
||||||
|
this.previousNames = u.previousNames;
|
||||||
|
this.nameChangedAt = u.nameChangedAt;
|
||||||
|
this.scopes = u.scopes;
|
||||||
|
this.authenticated = u.authenticated;
|
||||||
|
}
|
||||||
|
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
displayName: string;
|
displayName: string;
|
||||||
|
|
||||||
displayColor: number;
|
displayColor: number;
|
||||||
|
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
|
|
||||||
previousNames: string[];
|
previousNames: string[];
|
||||||
|
|
||||||
nameChangedAt: Date;
|
nameChangedAt: Date;
|
||||||
|
|
||||||
scopes: string[];
|
scopes: string[];
|
||||||
|
|
||||||
authenticated: boolean;
|
authenticated: boolean;
|
||||||
|
|
||||||
|
public isModerator = (): boolean => {
|
||||||
|
if (!this.scopes || this.scopes.length === 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.scopes.includes('moderator');
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue