Make testing for moderator state centralized in User class

This commit is contained in:
Gabe Kangas 2023-03-03 21:54:01 -08:00
parent e5dee5d258
commit c4f057eded
No known key found for this signature in database
GPG key ID: 4345B2060657F330
6 changed files with 59 additions and 27 deletions

View file

@ -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> = ({

View file

@ -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');
}

View file

@ -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]);

View file

@ -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;
} }

View file

@ -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));

View file

@ -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');
};
} }