wip direct messages
This commit is contained in:
9
Makefile
9
Makefile
@@ -24,5 +24,14 @@ destroy:
|
|||||||
- docker images -aq | xargs --no-run-if-empty docker rmi -f
|
- docker images -aq | xargs --no-run-if-empty docker rmi -f
|
||||||
- docker volume ls -q | xargs --no-run-if-empty docker volume rm
|
- docker volume ls -q | xargs --no-run-if-empty docker volume rm
|
||||||
|
|
||||||
|
# temp for hugo
|
||||||
|
db:
|
||||||
|
- docker compose -f postgresql -v down
|
||||||
|
- docker rm -f postgresql
|
||||||
|
- docker volume rm -f srcs_data_nest_postgresql
|
||||||
|
docker compose -f ${DOCKERCOMPOSEPATH} up -d --build
|
||||||
|
@make start
|
||||||
|
@docker ps
|
||||||
|
|
||||||
stop:
|
stop:
|
||||||
docker compose -f ${DOCKERCOMPOSEPATH} stop
|
docker compose -f ${DOCKERCOMPOSEPATH} stop
|
||||||
|
|||||||
25
README.md
25
README.md
@@ -68,15 +68,22 @@
|
|||||||
|
|
||||||
#### chat :
|
#### chat :
|
||||||
|
|
||||||
- [ ] can create chat-rooms (public/private, password protected)
|
- [/] create public room
|
||||||
- [ ] send direct messages
|
- [ ] create private room
|
||||||
- [ ] block other users
|
- [/] create direct room
|
||||||
- [ ] creators of chat-room are owners, untill they leave
|
- [/] chat in room
|
||||||
- [ ] chat-room owner can set, change, remove password
|
- [/] join rooms
|
||||||
- [ ] chat-room owner is administrator and can set other administrators
|
- [/] see all joignable rooms
|
||||||
- [ ] administrators can ban or mute for a time other users
|
- [/] see all my rooms
|
||||||
- [ ] send game invitation in chat
|
- [/] leave room
|
||||||
- [ ] view user profiles from chat
|
- [ ] invite someone in room
|
||||||
|
- [ ] make admin
|
||||||
|
- [ ] ban
|
||||||
|
- [ ] mute
|
||||||
|
- [ ] protect room with password
|
||||||
|
- [ ] bock users
|
||||||
|
- [ ] send game invitation
|
||||||
|
- [ ] view user profiles
|
||||||
|
|
||||||
#### game :
|
#### game :
|
||||||
|
|
||||||
|
|||||||
@@ -18,52 +18,13 @@ export class ChatController {
|
|||||||
private chatGateway: ChatGateway,
|
private chatGateway: ChatGateway,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
|
// don't allow '+' because it's used in direct rooms name
|
||||||
private allowed_chars = '-#!?_';
|
private allowed_chars = '-#!?_';
|
||||||
private escape_chars(str)
|
private escape_chars(str)
|
||||||
{
|
{
|
||||||
return str.split("").join("\\");
|
return str.split("").join("\\");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
The requested user found.
|
|
||||||
AuthenticateGuard : Is User authenticated : true
|
|
||||||
- in createRoom controller
|
|
||||||
-- in addUserToNewRoom service
|
|
||||||
-- in getRoomByName service
|
|
||||||
-- out getRoomByName service
|
|
||||||
-- out addUserToNewRoom service
|
|
||||||
- out createRoom controller
|
|
||||||
The requested user found.
|
|
||||||
AuthenticateGuard : Is User authenticated : true
|
|
||||||
The requested user found.
|
|
||||||
AuthenticateGuard : Is User authenticated : true
|
|
||||||
- in getMessages controller
|
|
||||||
-- in getMessagesFromCurrentRoom service
|
|
||||||
-- in getUserByName service
|
|
||||||
-- out getUserByName service
|
|
||||||
--- currentUser:
|
|
||||||
User {
|
|
||||||
id: 1,
|
|
||||||
fortyTwoId: '42522',
|
|
||||||
username: 'hulamy',
|
|
||||||
email: 'hulamy@student.42.fr',
|
|
||||||
image_url: 'default.png',
|
|
||||||
phone: null,
|
|
||||||
status: 'Connected',
|
|
||||||
isEnabledTwoFactorAuth: false,
|
|
||||||
isTwoFactorAuthenticated: false,
|
|
||||||
secretTwoFactorAuth: null,
|
|
||||||
currentRoom: null
|
|
||||||
}
|
|
||||||
-- in getRoomByName service
|
|
||||||
-- out getRoomByName service
|
|
||||||
--- currentRoom:
|
|
||||||
null
|
|
||||||
-- out getMessagesFromCurrentRoom service
|
|
||||||
- out getMessages controller
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
@UseGuards(AuthenticateGuard)
|
@UseGuards(AuthenticateGuard)
|
||||||
@UseGuards(TwoFactorGuard)
|
@UseGuards(TwoFactorGuard)
|
||||||
@@ -83,6 +44,7 @@ null
|
|||||||
{
|
{
|
||||||
console.log("- in getAllRooms controller");
|
console.log("- in getAllRooms controller");
|
||||||
const rooms = await this.chatService.getAllOtherRoomsAndUsers(req.user.username)
|
const rooms = await this.chatService.getAllOtherRoomsAndUsers(req.user.username)
|
||||||
|
console.log("--- rooms:", rooms);
|
||||||
|
|
||||||
res.status(HttpStatus.OK).json({ rooms: rooms });
|
res.status(HttpStatus.OK).json({ rooms: rooms });
|
||||||
console.log("- out getAllRooms controller");
|
console.log("- out getAllRooms controller");
|
||||||
@@ -119,14 +81,14 @@ null
|
|||||||
let chars = this.escape_chars(this.allowed_chars);
|
let chars = this.escape_chars(this.allowed_chars);
|
||||||
let regex_base = `[a-zA-Z0-9\\s${chars}]`;
|
let regex_base = `[a-zA-Z0-9\\s${chars}]`;
|
||||||
let test_regex = new RegExp(`^${regex_base}+$`);
|
let test_regex = new RegExp(`^${regex_base}+$`);
|
||||||
if (test_regex.test(createRoomDto.room_name) === false)
|
if (test_regex.test(createRoomDto.name) === false)
|
||||||
{
|
{
|
||||||
let forbidden_chars = createRoomDto.room_name.replace(new RegExp(regex_base, "g"), "");
|
let forbidden_chars = createRoomDto.name.replace(new RegExp(regex_base, "g"), "");
|
||||||
throw new HttpException(`Your room name can not contains these characters : ${forbidden_chars}`, HttpStatus.UNPROCESSABLE_ENTITY);
|
throw new HttpException(`Your room name can not contains these characters : ${forbidden_chars}`, HttpStatus.UNPROCESSABLE_ENTITY);
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await this.chatService.addUserToNewRoom(req.user.username, createRoomDto);
|
const response = await this.chatService.addUserToNewRoom(req.user.username, createRoomDto);
|
||||||
res.status(HttpStatus.OK).json({ room_name: createRoomDto.room_name, message: response });
|
res.status(HttpStatus.OK).json({ room_name: createRoomDto.name, message: response });
|
||||||
console.log("- out createRoom controller");
|
console.log("- out createRoom controller");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,12 +98,23 @@ null
|
|||||||
async joinRoom(@Body() room: roomDto, @Req() req, @Res() res): Promise<void>
|
async joinRoom(@Body() room: roomDto, @Req() req, @Res() res): Promise<void>
|
||||||
{
|
{
|
||||||
console.log("- in joinRoom controller");
|
console.log("- in joinRoom controller");
|
||||||
const response = await this.chatService.addUserToRoom(req.user.username, room.room_name);
|
let response = "";
|
||||||
|
if (room.type === 'direct')
|
||||||
|
throw new HttpException(`cannot join a direct messages room`, HttpStatus.CONFLICT);
|
||||||
|
else if (room.type === 'user')
|
||||||
|
{
|
||||||
|
room.type = 'direct';
|
||||||
|
room.users = [room.name, req.user.username];
|
||||||
|
room.name += ` + ${req.user.username}`;
|
||||||
|
await this.chatService.addUserToNewRoom(req.user.username, room);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
await this.chatService.addUserToRoom(req.user.username, room.name);
|
||||||
|
|
||||||
let socket: socketDto = this.chatGateway.sockets.get(req.user.username);
|
let socket: socketDto = this.chatGateway.sockets.get(req.user.username);
|
||||||
await this.chatService.socketJoinRoom(socket, room.room_name);
|
await this.chatService.socketJoinRoom(socket, room.name);
|
||||||
|
|
||||||
res.status(HttpStatus.OK).json({ room_name: room.room_name, message: response });
|
res.status(HttpStatus.OK).json({ room: room });
|
||||||
console.log("- out joinRoom controller");
|
console.log("- out joinRoom controller");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,12 +124,12 @@ null
|
|||||||
async changeRoom(@Body() room: roomDto, @Req() req, @Res() res): Promise<void>
|
async changeRoom(@Body() room: roomDto, @Req() req, @Res() res): Promise<void>
|
||||||
{
|
{
|
||||||
console.log("- in changeRoom controller");
|
console.log("- in changeRoom controller");
|
||||||
const response = await this.chatService.setCurrentRoom(req.user.username, room.room_name);
|
const response = await this.chatService.setCurrentRoom(req.user.username, room.name);
|
||||||
|
|
||||||
let socket: socketDto = this.chatGateway.sockets.get(req.user.username);
|
let socket: socketDto = this.chatGateway.sockets.get(req.user.username);
|
||||||
await this.chatService.socketChangeRoom(socket, room.room_name);
|
await this.chatService.socketChangeRoom(socket, room.name);
|
||||||
|
|
||||||
res.status(HttpStatus.OK).json({ room_name: room.room_name, message: response });
|
res.status(HttpStatus.OK).json({ room: room });
|
||||||
console.log("- out changeRoom controller");
|
console.log("- out changeRoom controller");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -78,31 +78,28 @@ export class ChatService {
|
|||||||
return rooms;
|
return rooms;
|
||||||
}
|
}
|
||||||
|
|
||||||
//async getAllOtherRoomsAndUsers(username: string): Promise<roomDto[]>
|
async getAllOtherRoomsAndUsers(username: string): Promise<roomDto[]>
|
||||||
async getAllOtherRoomsAndUsers(username: string): Promise<roomDto>
|
|
||||||
{
|
{
|
||||||
console.log("-- in getAllOtherRoomsAndUsers service");
|
console.log("-- in getAllOtherRoomsAndUsers service");
|
||||||
const all_rooms = await this.getAllNotMyRooms(username);
|
const all_rooms = await this.getAllNotMyRooms(username);
|
||||||
const all_users = await this.getAllUsersNotMyRooms(username);
|
const all_users = await this.getAllUsersNotMyRooms(username);
|
||||||
|
|
||||||
// let row_rooms = all_rooms.map(room => {
|
console.log("--- all_rooms:", all_rooms)
|
||||||
// return {
|
console.log("--- all_users:", all_users)
|
||||||
// room_name: room.name,
|
let row_rooms = all_rooms.map(room => {
|
||||||
// room_type: "",
|
return {
|
||||||
// };
|
name: room.name,
|
||||||
// });
|
type: room.type,
|
||||||
// let users = all_users.map(user => {
|
};
|
||||||
// return {
|
});
|
||||||
// room_name: user.username,
|
let users = all_users.map(user => {
|
||||||
// room_type: "",
|
return {
|
||||||
// };
|
name: user.username,
|
||||||
// });
|
type: "user",
|
||||||
// let rooms = row_rooms.concat(users);
|
};
|
||||||
|
});
|
||||||
let rooms: roomDto = {
|
let rooms = row_rooms.concat(users);
|
||||||
room_name: "room.name",
|
console.log("--- rooms:", rooms)
|
||||||
room_type: "",
|
|
||||||
};
|
|
||||||
|
|
||||||
console.log("-- in getAllOtherRoomsAndUsers service");
|
console.log("-- in getAllOtherRoomsAndUsers service");
|
||||||
return rooms;
|
return rooms;
|
||||||
@@ -112,11 +109,7 @@ export class ChatService {
|
|||||||
{
|
{
|
||||||
console.log("-- in getMessagesFromCurrentRoom service");
|
console.log("-- in getMessagesFromCurrentRoom service");
|
||||||
const user_db = await this.getUserByName(username);
|
const user_db = await this.getUserByName(username);
|
||||||
console.log("--- currentUser:");
|
|
||||||
console.log(user_db);
|
|
||||||
const currentRoom = await this.getRoomByName(user_db.currentRoom);
|
const currentRoom = await this.getRoomByName(user_db.currentRoom);
|
||||||
console.log("--- currentRoom:");
|
|
||||||
console.log(currentRoom);
|
|
||||||
let messages = null;
|
let messages = null;
|
||||||
if (currentRoom)
|
if (currentRoom)
|
||||||
messages = currentRoom.messages;
|
messages = currentRoom.messages;
|
||||||
@@ -140,7 +133,7 @@ export class ChatService {
|
|||||||
console.log("-- in getRoomByName service");
|
console.log("-- in getRoomByName service");
|
||||||
const room = await this.chatroomRepository
|
const room = await this.chatroomRepository
|
||||||
.createQueryBuilder('chatroom')
|
.createQueryBuilder('chatroom')
|
||||||
.where('chatroom.name = :name', { name: room_name })
|
.where('chatroom.name = :name', { name: room_name.replace("+", "\\+") })
|
||||||
.getOne();
|
.getOne();
|
||||||
|
|
||||||
console.log("-- out getRoomByName service");
|
console.log("-- out getRoomByName service");
|
||||||
@@ -178,27 +171,28 @@ export class ChatService {
|
|||||||
/* ADDERS *************************************************
|
/* ADDERS *************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
async addUserToNewRoom(username: string, createRoomDto: createRoomDto): Promise<string>
|
async addUserToNewRoom(username: string, createRoomDto: createRoomDto): Promise<void>
|
||||||
{
|
{
|
||||||
console.log("-- in addUserToNewRoom service");
|
console.log("-- in addUserToNewRoom service");
|
||||||
const room = await this.getRoomByName(createRoomDto.room_name);
|
const room = await this.getRoomByName(createRoomDto.name);
|
||||||
if (room)
|
if (room)
|
||||||
throw new HttpException(`This room name already exist`, HttpStatus.CONFLICT);
|
throw new HttpException(`This room name already exist`, HttpStatus.CONFLICT);
|
||||||
|
|
||||||
// create chatroom
|
// create chatroom
|
||||||
const newChatroom = new Chatroom();
|
const newChatroom = new Chatroom();
|
||||||
newChatroom.name = createRoomDto.room_name;
|
newChatroom.name = createRoomDto.name;
|
||||||
newChatroom.type = createRoomDto.room_type;
|
newChatroom.type = createRoomDto.type;
|
||||||
newChatroom.owner = username;
|
newChatroom.owner = username;
|
||||||
newChatroom.users = [username];
|
newChatroom.users = [username];
|
||||||
newChatroom.messages = [{ name: "SERVER", message: `creation of room ${createRoomDto.room_name}` }];
|
if (createRoomDto.type === 'direct')
|
||||||
|
newChatroom.users = createRoomDto.users;
|
||||||
|
newChatroom.messages = [{ name: "SERVER", message: `creation of room ${createRoomDto.name}` }];
|
||||||
this.chatroomRepository.save(newChatroom);
|
this.chatroomRepository.save(newChatroom);
|
||||||
|
|
||||||
console.log("-- out addUserToNewRoom service");
|
console.log("-- out addUserToNewRoom service");
|
||||||
return "successfull room creation";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async addUserToRoom(username: string, room_name: string): Promise<string>
|
async addUserToRoom(username: string, room_name: string): Promise<void>
|
||||||
{
|
{
|
||||||
console.log("-- in addUserToRoom service");
|
console.log("-- in addUserToRoom service");
|
||||||
const room = await this.getRoomByName(room_name);
|
const room = await this.getRoomByName(room_name);
|
||||||
@@ -212,19 +206,20 @@ export class ChatService {
|
|||||||
await this.setCurrentRoom(username, room_name);
|
await this.setCurrentRoom(username, room_name);
|
||||||
|
|
||||||
console.log("-- out addUserToRoom service");
|
console.log("-- out addUserToRoom service");
|
||||||
return "successfully joining room";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async addMessageToRoom(room_name: string, username: string, message: string): Promise<void>
|
async addMessageToRoom(room_name: string, username: string, message: string): Promise<void>
|
||||||
{
|
{
|
||||||
console.log("-- in addMessageToRoom service");
|
console.log("-- in addMessageToRoom service");
|
||||||
const currentRoom = await this.getRoomByName(room_name);
|
console.log("--- room_name:", room_name);
|
||||||
|
const my_room = await this.getRoomByName(room_name);
|
||||||
|
console.log("--- my_room:", my_room);
|
||||||
let chat_message = {
|
let chat_message = {
|
||||||
name: username,
|
name: username,
|
||||||
message: message,
|
message: message,
|
||||||
};
|
};
|
||||||
currentRoom.messages.push(chat_message);
|
my_room.messages.push(chat_message);
|
||||||
this.chatroomRepository.save(currentRoom);
|
this.chatroomRepository.save(my_room);
|
||||||
console.log("-- out addMessageToRoom service");
|
console.log("-- out addMessageToRoom service");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,7 +267,15 @@ export class ChatService {
|
|||||||
console.log("-- in getAllUsersNotMyRooms service");
|
console.log("-- in getAllUsersNotMyRooms service");
|
||||||
|
|
||||||
const directs = await this.getMyDirects(username);
|
const directs = await this.getMyDirects(username);
|
||||||
let usernames = directs.map(room => room.users[0]);
|
console.log("--- directs:", directs);
|
||||||
|
|
||||||
|
// get all users from directs
|
||||||
|
let usernames = directs.map(room => {
|
||||||
|
let user = room.users[0];
|
||||||
|
if (user === username)
|
||||||
|
user = room.users[1];
|
||||||
|
return user;
|
||||||
|
});
|
||||||
usernames.push(username);
|
usernames.push(username);
|
||||||
console.log("usernames:", usernames);
|
console.log("usernames:", usernames);
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,6 @@ export class createRoomDto extends roomDto
|
|||||||
{
|
{
|
||||||
@IsString()
|
@IsString()
|
||||||
@IsOptional()
|
@IsOptional()
|
||||||
room_password: string;
|
password?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,12 +6,17 @@ export class roomDto
|
|||||||
@Expose()
|
@Expose()
|
||||||
@IsString()
|
@IsString()
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
room_name: string;
|
name: string;
|
||||||
|
|
||||||
@Expose()
|
@Expose()
|
||||||
//@IsString()
|
@IsString()
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
//@IsIn(["public", "protected", "private", "direct", "user"])
|
@IsIn(["public", "protected", "private", "direct", "user"])
|
||||||
room_type: string;
|
type: string;
|
||||||
|
|
||||||
|
@Expose()
|
||||||
|
@IsString()
|
||||||
|
@IsOptional()
|
||||||
|
users?: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3890,33 +3890,31 @@ var app = (function () {
|
|||||||
message: response_message
|
message: response_message
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
async function join_room(room_name) {
|
async function join_room(room) {
|
||||||
console.log("in join_room");
|
console.log("in join_room");
|
||||||
console.log(room_name);
|
|
||||||
let name = {
|
|
||||||
room_name: room_name,
|
|
||||||
};
|
|
||||||
const response = await fetch('/api/v2/chat/join', {
|
const response = await fetch('/api/v2/chat/join', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify(name),
|
body: JSON.stringify(room),
|
||||||
});
|
});
|
||||||
let data = await response.json();
|
let data = await response.json();
|
||||||
console.log(data.message);
|
return data.room;
|
||||||
}
|
}
|
||||||
async function change_room(room_name) {
|
async function change_room(room) {
|
||||||
console.log("in change_room");
|
console.log("in change_room");
|
||||||
let room_name_request = {
|
|
||||||
room_name: room_name,
|
|
||||||
};
|
|
||||||
const response = await fetch('/api/v2/chat/change', {
|
const response = await fetch('/api/v2/chat/change', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify(room_name_request),
|
body: JSON.stringify(room),
|
||||||
});
|
});
|
||||||
let data = await response.json();
|
let data = await response.json();
|
||||||
console.log(data.message);
|
|
||||||
await get_room_messages();
|
await get_room_messages();
|
||||||
|
let room_name = data.room.name;
|
||||||
|
if (room.type === 'direct') {
|
||||||
|
room_name === room.users[0];
|
||||||
|
if (room_name === user.username)
|
||||||
|
room_name === room.users[1];
|
||||||
|
}
|
||||||
current_room_name.set(room_name);
|
current_room_name.set(room_name);
|
||||||
layout.set("room");
|
layout.set("room");
|
||||||
}
|
}
|
||||||
@@ -3924,38 +3922,25 @@ var app = (function () {
|
|||||||
console.log("in get_my_rooms");
|
console.log("in get_my_rooms");
|
||||||
const response = await fetch('/api/v2/chat/myrooms');
|
const response = await fetch('/api/v2/chat/myrooms');
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
console.log("data.rooms:", data.rooms);
|
return data.rooms;
|
||||||
for (let room of data.rooms)
|
|
||||||
console.log(room.name);
|
|
||||||
let rooms = data.rooms;
|
|
||||||
return rooms;
|
|
||||||
}
|
}
|
||||||
async function get_all_rooms() {
|
async function get_all_rooms() {
|
||||||
console.log("in get_all_rooms");
|
console.log("in get_all_rooms");
|
||||||
const response = await fetch('/api/v2/chat/allrooms');
|
const response = await fetch('/api/v2/chat/allrooms');
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
console.log("data.rooms:", data.rooms);
|
return data.rooms;
|
||||||
for (let room of data.rooms)
|
|
||||||
console.log(room.name);
|
|
||||||
return rooms;
|
|
||||||
}
|
}
|
||||||
async function get_room_users() {
|
async function get_room_users() {
|
||||||
console.log("in get_room_users");
|
console.log("in get_room_users");
|
||||||
const response = await fetch('/api/v2/chat/roomusers');
|
const response = await fetch('/api/v2/chat/roomusers');
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
console.log("data.users:", data.users);
|
return data.users;
|
||||||
for (let user of data.users)
|
|
||||||
console.log(user.username);
|
|
||||||
let users = data.users;
|
|
||||||
return users;
|
|
||||||
}
|
}
|
||||||
async function user_leave_room() {
|
async function user_leave_room() {
|
||||||
console.log("in leave_room");
|
console.log("in leave_room");
|
||||||
const response = await fetch('/api/v2/chat/removeuser', {
|
await fetch('/api/v2/chat/removeuser', {
|
||||||
method: 'DELETE',
|
method: 'DELETE',
|
||||||
});
|
});
|
||||||
const data = await response.json();
|
|
||||||
console.log("data", data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* src/pieces/chat/Layout_home.svelte generated by Svelte v3.53.1 */
|
/* src/pieces/chat/Layout_home.svelte generated by Svelte v3.53.1 */
|
||||||
@@ -5280,11 +5265,11 @@ var app = (function () {
|
|||||||
|
|
||||||
function get_each_context$6(ctx, list, i) {
|
function get_each_context$6(ctx, list, i) {
|
||||||
const child_ctx = ctx.slice();
|
const child_ctx = ctx.slice();
|
||||||
child_ctx[3] = list[i];
|
child_ctx[4] = list[i];
|
||||||
return child_ctx;
|
return child_ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
// (26:1) <Button new_layout={back} my_class="back icon" my_title="go back {back}">
|
// (20:1) <Button new_layout={back} my_class="back icon" my_title="go back {back}">
|
||||||
function create_default_slot_4$3(ctx) {
|
function create_default_slot_4$3(ctx) {
|
||||||
let t;
|
let t;
|
||||||
|
|
||||||
@@ -5304,14 +5289,14 @@ var app = (function () {
|
|||||||
block,
|
block,
|
||||||
id: create_default_slot_4$3.name,
|
id: create_default_slot_4$3.name,
|
||||||
type: "slot",
|
type: "slot",
|
||||||
source: "(26:1) <Button new_layout={back} my_class=\\\"back icon\\\" my_title=\\\"go back {back}\\\">",
|
source: "(20:1) <Button new_layout={back} my_class=\\\"back icon\\\" my_title=\\\"go back {back}\\\">",
|
||||||
ctx
|
ctx
|
||||||
});
|
});
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
// (31:1) <Button my_class="new deactivate">
|
// (25:1) <Button my_class="new deactivate">
|
||||||
function create_default_slot_3$4(ctx) {
|
function create_default_slot_3$4(ctx) {
|
||||||
let t;
|
let t;
|
||||||
|
|
||||||
@@ -5331,14 +5316,14 @@ var app = (function () {
|
|||||||
block,
|
block,
|
||||||
id: create_default_slot_3$4.name,
|
id: create_default_slot_3$4.name,
|
||||||
type: "slot",
|
type: "slot",
|
||||||
source: "(31:1) <Button my_class=\\\"new deactivate\\\">",
|
source: "(25:1) <Button my_class=\\\"new deactivate\\\">",
|
||||||
ctx
|
ctx
|
||||||
});
|
});
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
// (36:1) <Button new_layout="close" my_class="close icon">
|
// (30:1) <Button new_layout="close" my_class="close icon">
|
||||||
function create_default_slot_2$8(ctx) {
|
function create_default_slot_2$8(ctx) {
|
||||||
let t;
|
let t;
|
||||||
|
|
||||||
@@ -5358,14 +5343,14 @@ var app = (function () {
|
|||||||
block,
|
block,
|
||||||
id: create_default_slot_2$8.name,
|
id: create_default_slot_2$8.name,
|
||||||
type: "slot",
|
type: "slot",
|
||||||
source: "(36:1) <Button new_layout=\\\"close\\\" my_class=\\\"close icon\\\">",
|
source: "(30:1) <Button new_layout=\\\"close\\\" my_class=\\\"close icon\\\">",
|
||||||
ctx
|
ctx
|
||||||
});
|
});
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
// (42:2) <Button new_layout="create" my_class="create">
|
// (36:2) <Button new_layout="create" my_class="create">
|
||||||
function create_default_slot_1$8(ctx) {
|
function create_default_slot_1$8(ctx) {
|
||||||
let t;
|
let t;
|
||||||
|
|
||||||
@@ -5385,14 +5370,14 @@ var app = (function () {
|
|||||||
block,
|
block,
|
||||||
id: create_default_slot_1$8.name,
|
id: create_default_slot_1$8.name,
|
||||||
type: "slot",
|
type: "slot",
|
||||||
source: "(42:2) <Button new_layout=\\\"create\\\" my_class=\\\"create\\\">",
|
source: "(36:2) <Button new_layout=\\\"create\\\" my_class=\\\"create\\\">",
|
||||||
ctx
|
ctx
|
||||||
});
|
});
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
// (1:0) <script> import { layout, msgs, user, socket }
|
// (1:0) <script lang="ts">import './Store_chat'; import { join_room, change_room, get_all_rooms }
|
||||||
function create_catch_block$2(ctx) {
|
function create_catch_block$2(ctx) {
|
||||||
const block = {
|
const block = {
|
||||||
c: noop,
|
c: noop,
|
||||||
@@ -5407,14 +5392,14 @@ var app = (function () {
|
|||||||
block,
|
block,
|
||||||
id: create_catch_block$2.name,
|
id: create_catch_block$2.name,
|
||||||
type: "catch",
|
type: "catch",
|
||||||
source: "(1:0) <script> import { layout, msgs, user, socket }",
|
source: "(1:0) <script lang=\\\"ts\\\">import './Store_chat'; import { join_room, change_room, get_all_rooms }",
|
||||||
ctx
|
ctx
|
||||||
});
|
});
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
// (52:3) {:then rooms}
|
// (46:3) {:then rooms}
|
||||||
function create_then_block$2(ctx) {
|
function create_then_block$2(ctx) {
|
||||||
let each_1_anchor;
|
let each_1_anchor;
|
||||||
let current;
|
let current;
|
||||||
@@ -5503,16 +5488,16 @@ var app = (function () {
|
|||||||
block,
|
block,
|
||||||
id: create_then_block$2.name,
|
id: create_then_block$2.name,
|
||||||
type: "then",
|
type: "then",
|
||||||
source: "(52:3) {:then rooms}",
|
source: "(46:3) {:then rooms}",
|
||||||
ctx
|
ctx
|
||||||
});
|
});
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
// (54:5) <Button my_class="list" on_click={join_rooms}>
|
// (48:5) <Button my_class="list" on_click={function() {join_rooms(room)}}>
|
||||||
function create_default_slot$9(ctx) {
|
function create_default_slot$9(ctx) {
|
||||||
let t0_value = /*room*/ ctx[3].name + "";
|
let t0_value = /*room*/ ctx[4].name + "";
|
||||||
let t0;
|
let t0;
|
||||||
let t1;
|
let t1;
|
||||||
|
|
||||||
@@ -5536,22 +5521,26 @@ var app = (function () {
|
|||||||
block,
|
block,
|
||||||
id: create_default_slot$9.name,
|
id: create_default_slot$9.name,
|
||||||
type: "slot",
|
type: "slot",
|
||||||
source: "(54:5) <Button my_class=\\\"list\\\" on_click={join_rooms}>",
|
source: "(48:5) <Button my_class=\\\"list\\\" on_click={function() {join_rooms(room)}}>",
|
||||||
ctx
|
ctx
|
||||||
});
|
});
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
// (53:4) {#each rooms as room}
|
// (47:4) {#each rooms as room}
|
||||||
function create_each_block$6(ctx) {
|
function create_each_block$6(ctx) {
|
||||||
let button;
|
let button;
|
||||||
let current;
|
let current;
|
||||||
|
|
||||||
|
function func() {
|
||||||
|
return /*func*/ ctx[3](/*room*/ ctx[4]);
|
||||||
|
}
|
||||||
|
|
||||||
button = new Element_button({
|
button = new Element_button({
|
||||||
props: {
|
props: {
|
||||||
my_class: "list",
|
my_class: "list",
|
||||||
on_click: /*join_rooms*/ ctx[1],
|
on_click: func,
|
||||||
$$slots: { default: [create_default_slot$9] },
|
$$slots: { default: [create_default_slot$9] },
|
||||||
$$scope: { ctx }
|
$$scope: { ctx }
|
||||||
},
|
},
|
||||||
@@ -5566,10 +5555,11 @@ var app = (function () {
|
|||||||
mount_component(button, target, anchor);
|
mount_component(button, target, anchor);
|
||||||
current = true;
|
current = true;
|
||||||
},
|
},
|
||||||
p: function update(ctx, dirty) {
|
p: function update(new_ctx, dirty) {
|
||||||
|
ctx = new_ctx;
|
||||||
const button_changes = {};
|
const button_changes = {};
|
||||||
|
|
||||||
if (dirty & /*$$scope*/ 64) {
|
if (dirty & /*$$scope*/ 128) {
|
||||||
button_changes.$$scope = { dirty, ctx };
|
button_changes.$$scope = { dirty, ctx };
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5593,14 +5583,14 @@ var app = (function () {
|
|||||||
block,
|
block,
|
||||||
id: create_each_block$6.name,
|
id: create_each_block$6.name,
|
||||||
type: "each",
|
type: "each",
|
||||||
source: "(53:4) {#each rooms as room}",
|
source: "(47:4) {#each rooms as room}",
|
||||||
ctx
|
ctx
|
||||||
});
|
});
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
// (50:17) <p>rooms are loading...</p> {:then rooms}
|
// (44:17) <p>rooms are loading...</p> {:then rooms}
|
||||||
function create_pending_block$2(ctx) {
|
function create_pending_block$2(ctx) {
|
||||||
let p;
|
let p;
|
||||||
|
|
||||||
@@ -5608,7 +5598,7 @@ var app = (function () {
|
|||||||
c: function create() {
|
c: function create() {
|
||||||
p = element("p");
|
p = element("p");
|
||||||
p.textContent = "rooms are loading...";
|
p.textContent = "rooms are loading...";
|
||||||
add_location(p, file$n, 50, 4, 1077);
|
add_location(p, file$n, 44, 4, 1114);
|
||||||
},
|
},
|
||||||
m: function mount(target, anchor) {
|
m: function mount(target, anchor) {
|
||||||
insert_dev(target, p, anchor);
|
insert_dev(target, p, anchor);
|
||||||
@@ -5625,7 +5615,7 @@ var app = (function () {
|
|||||||
block,
|
block,
|
||||||
id: create_pending_block$2.name,
|
id: create_pending_block$2.name,
|
||||||
type: "pending",
|
type: "pending",
|
||||||
source: "(50:17) <p>rooms are loading...</p> {:then rooms}",
|
source: "(44:17) <p>rooms are loading...</p> {:then rooms}",
|
||||||
ctx
|
ctx
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -5726,17 +5716,17 @@ var app = (function () {
|
|||||||
p1.textContent = "/ there are no public rooms yet /";
|
p1.textContent = "/ there are no public rooms yet /";
|
||||||
t7 = space();
|
t7 = space();
|
||||||
info.block.c();
|
info.block.c();
|
||||||
add_location(p0, file$n, 44, 2, 897);
|
add_location(p0, file$n, 38, 2, 934);
|
||||||
attr_dev(p1, "class", "__center");
|
attr_dev(p1, "class", "__center");
|
||||||
add_location(p1, file$n, 47, 4, 987);
|
add_location(p1, file$n, 41, 4, 1024);
|
||||||
attr_dev(div0, "class", "__show_if_only_child");
|
attr_dev(div0, "class", "__show_if_only_child");
|
||||||
add_location(div0, file$n, 46, 3, 948);
|
add_location(div0, file$n, 40, 3, 985);
|
||||||
attr_dev(div1, "class", "public_rooms");
|
attr_dev(div1, "class", "public_rooms");
|
||||||
add_location(div1, file$n, 45, 2, 918);
|
add_location(div1, file$n, 39, 2, 955);
|
||||||
attr_dev(div2, "class", "panel panel_new __border_top");
|
attr_dev(div2, "class", "panel panel_new __border_top");
|
||||||
add_location(div2, file$n, 40, 1, 781);
|
add_location(div2, file$n, 34, 1, 818);
|
||||||
attr_dev(div3, "class", "grid_box svelte-1b4c0qx");
|
attr_dev(div3, "class", "grid_box svelte-1b4c0qx");
|
||||||
add_location(div3, file$n, 22, 0, 472);
|
add_location(div3, file$n, 16, 0, 509);
|
||||||
},
|
},
|
||||||
l: function claim(nodes) {
|
l: function claim(nodes) {
|
||||||
throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option");
|
throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option");
|
||||||
@@ -5769,28 +5759,28 @@ var app = (function () {
|
|||||||
if (dirty & /*back*/ 1) button0_changes.new_layout = /*back*/ ctx[0];
|
if (dirty & /*back*/ 1) button0_changes.new_layout = /*back*/ ctx[0];
|
||||||
if (dirty & /*back*/ 1) button0_changes.my_title = "go back " + /*back*/ ctx[0];
|
if (dirty & /*back*/ 1) button0_changes.my_title = "go back " + /*back*/ ctx[0];
|
||||||
|
|
||||||
if (dirty & /*$$scope*/ 64) {
|
if (dirty & /*$$scope*/ 128) {
|
||||||
button0_changes.$$scope = { dirty, ctx };
|
button0_changes.$$scope = { dirty, ctx };
|
||||||
}
|
}
|
||||||
|
|
||||||
button0.$set(button0_changes);
|
button0.$set(button0_changes);
|
||||||
const button1_changes = {};
|
const button1_changes = {};
|
||||||
|
|
||||||
if (dirty & /*$$scope*/ 64) {
|
if (dirty & /*$$scope*/ 128) {
|
||||||
button1_changes.$$scope = { dirty, ctx };
|
button1_changes.$$scope = { dirty, ctx };
|
||||||
}
|
}
|
||||||
|
|
||||||
button1.$set(button1_changes);
|
button1.$set(button1_changes);
|
||||||
const button2_changes = {};
|
const button2_changes = {};
|
||||||
|
|
||||||
if (dirty & /*$$scope*/ 64) {
|
if (dirty & /*$$scope*/ 128) {
|
||||||
button2_changes.$$scope = { dirty, ctx };
|
button2_changes.$$scope = { dirty, ctx };
|
||||||
}
|
}
|
||||||
|
|
||||||
button2.$set(button2_changes);
|
button2.$set(button2_changes);
|
||||||
const button3_changes = {};
|
const button3_changes = {};
|
||||||
|
|
||||||
if (dirty & /*$$scope*/ 64) {
|
if (dirty & /*$$scope*/ 128) {
|
||||||
button3_changes.$$scope = { dirty, ctx };
|
button3_changes.$$scope = { dirty, ctx };
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5849,11 +5839,13 @@ var app = (function () {
|
|||||||
let rooms = get_all_rooms();
|
let rooms = get_all_rooms();
|
||||||
|
|
||||||
// join the room
|
// join the room
|
||||||
async function join_rooms(evt) {
|
async function join_rooms(room) {
|
||||||
console.log("inside join_room");
|
console.log("inside join_room");
|
||||||
let room_name = evt.target.innerText;
|
console.log("room:", room);
|
||||||
await join_room(room_name);
|
console.log("room:", room);
|
||||||
await change_room(room_name);
|
const updated_room = await join_room(room);
|
||||||
|
console.log("updated room:", updated_room);
|
||||||
|
await change_room(updated_room);
|
||||||
}
|
}
|
||||||
|
|
||||||
const writable_props = ['back'];
|
const writable_props = ['back'];
|
||||||
@@ -5862,18 +5854,17 @@ var app = (function () {
|
|||||||
if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console_1$b.warn(`<Layout_new> was created with unknown prop '${key}'`);
|
if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console_1$b.warn(`<Layout_new> was created with unknown prop '${key}'`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const func = function (room) {
|
||||||
|
join_rooms(room);
|
||||||
|
};
|
||||||
|
|
||||||
$$self.$$set = $$props => {
|
$$self.$$set = $$props => {
|
||||||
if ('back' in $$props) $$invalidate(0, back = $$props.back);
|
if ('back' in $$props) $$invalidate(0, back = $$props.back);
|
||||||
};
|
};
|
||||||
|
|
||||||
$$self.$capture_state = () => ({
|
$$self.$capture_state = () => ({
|
||||||
layout,
|
|
||||||
msgs,
|
|
||||||
user,
|
|
||||||
socket: socket$1,
|
|
||||||
join_room,
|
join_room,
|
||||||
change_room,
|
change_room,
|
||||||
get_room_messages,
|
|
||||||
get_all_rooms,
|
get_all_rooms,
|
||||||
Button: Element_button,
|
Button: Element_button,
|
||||||
back,
|
back,
|
||||||
@@ -5890,7 +5881,7 @@ var app = (function () {
|
|||||||
$$self.$inject_state($$props.$$inject);
|
$$self.$inject_state($$props.$$inject);
|
||||||
}
|
}
|
||||||
|
|
||||||
return [back, join_rooms, rooms];
|
return [back, join_rooms, rooms, func];
|
||||||
}
|
}
|
||||||
|
|
||||||
class Layout_new extends SvelteComponentDev {
|
class Layout_new extends SvelteComponentDev {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
|
|||||||
<script>
|
<script lang="ts">
|
||||||
|
|
||||||
import { layout, msgs, user, socket } from './Store_chat';
|
import { layout, msgs, user, socket } from './Store_chat';
|
||||||
import { join_room, change_room, get_room_messages, get_all_rooms } from './Request_rooms';
|
import { join_room, change_room, get_room_messages, get_all_rooms } from './Request_rooms';
|
||||||
@@ -9,13 +9,15 @@
|
|||||||
let rooms = get_all_rooms();
|
let rooms = get_all_rooms();
|
||||||
|
|
||||||
// join the room
|
// join the room
|
||||||
async function join_rooms(evt)
|
async function join_rooms(room: object)
|
||||||
{
|
{
|
||||||
console.log("inside join_room");
|
console.log("inside join_room");
|
||||||
let room_name = evt.target.innerText;
|
console.log("room:", room);
|
||||||
|
|
||||||
await join_room(room_name);
|
console.log("room:", room);
|
||||||
await change_room(room_name);
|
const updated_room = await join_room(room);
|
||||||
|
console.log("updated room:", updated_room);
|
||||||
|
await change_room(updated_room);
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
@@ -51,7 +53,7 @@
|
|||||||
<p>rooms are loading...</p>
|
<p>rooms are loading...</p>
|
||||||
{:then rooms}
|
{:then rooms}
|
||||||
{#each rooms as room}
|
{#each rooms as room}
|
||||||
<Button my_class="list" on_click={join_rooms}>
|
<Button my_class="list" on_click={function() {join_rooms(room)}}>
|
||||||
{room.name}
|
{room.name}
|
||||||
</Button>
|
</Button>
|
||||||
{/each}
|
{/each}
|
||||||
|
|||||||
@@ -48,40 +48,40 @@ export async function create_room(room_name, room_type)
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function join_room(room_name)
|
export async function join_room(room)
|
||||||
{
|
{
|
||||||
console.log("in join_room");
|
console.log("in join_room");
|
||||||
console.log(room_name);
|
|
||||||
|
|
||||||
let name = {
|
|
||||||
room_name: room_name,
|
|
||||||
}
|
|
||||||
const response = await fetch('/api/v2/chat/join', {
|
const response = await fetch('/api/v2/chat/join', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify(name),
|
body: JSON.stringify(room),
|
||||||
});
|
});
|
||||||
let data = await response.json();
|
let data = await response.json();
|
||||||
console.log(data.message);
|
|
||||||
|
return data.room;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function change_room(room_name)
|
export async function change_room(room)
|
||||||
{
|
{
|
||||||
console.log("in change_room");
|
console.log("in change_room");
|
||||||
|
|
||||||
let room_name_request = {
|
|
||||||
room_name: room_name,
|
|
||||||
}
|
|
||||||
const response = await fetch('/api/v2/chat/change', {
|
const response = await fetch('/api/v2/chat/change', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify(room_name_request),
|
body: JSON.stringify(room),
|
||||||
});
|
});
|
||||||
let data = await response.json();
|
let data = await response.json();
|
||||||
console.log(data.message);
|
|
||||||
|
|
||||||
await get_room_messages();
|
await get_room_messages();
|
||||||
|
|
||||||
|
let room_name = data.room.name;
|
||||||
|
if (room.type === 'direct')
|
||||||
|
{
|
||||||
|
room_name === room.users[0];
|
||||||
|
if (room_name === user.username)
|
||||||
|
room_name === room.users[1];
|
||||||
|
}
|
||||||
current_room_name.set(room_name);
|
current_room_name.set(room_name);
|
||||||
layout.set("room");
|
layout.set("room");
|
||||||
}
|
}
|
||||||
@@ -93,12 +93,7 @@ export async function get_my_rooms()
|
|||||||
const response = await fetch('/api/v2/chat/myrooms');
|
const response = await fetch('/api/v2/chat/myrooms');
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
|
|
||||||
console.log("data.rooms:", data.rooms);
|
return data.rooms;
|
||||||
for (let room of data.rooms)
|
|
||||||
console.log(room.name);
|
|
||||||
let rooms = data.rooms;
|
|
||||||
|
|
||||||
return rooms;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function get_all_rooms()
|
export async function get_all_rooms()
|
||||||
@@ -108,11 +103,7 @@ export async function get_all_rooms()
|
|||||||
const response = await fetch('/api/v2/chat/allrooms');
|
const response = await fetch('/api/v2/chat/allrooms');
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
|
|
||||||
console.log("data.rooms:", data.rooms);
|
return data.rooms;
|
||||||
for (let room of data.rooms)
|
|
||||||
console.log(room.name);
|
|
||||||
|
|
||||||
return rooms;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function get_room_users()
|
export async function get_room_users()
|
||||||
@@ -122,12 +113,7 @@ export async function get_room_users()
|
|||||||
const response = await fetch('/api/v2/chat/roomusers');
|
const response = await fetch('/api/v2/chat/roomusers');
|
||||||
const data = await response.json();
|
const data = await response.json();
|
||||||
|
|
||||||
console.log("data.users:", data.users);
|
return data.users;
|
||||||
for (let user of data.users)
|
|
||||||
console.log(user.username);
|
|
||||||
let users = data.users;
|
|
||||||
|
|
||||||
return users;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function user_leave_room()
|
export async function user_leave_room()
|
||||||
@@ -137,9 +123,6 @@ export async function user_leave_room()
|
|||||||
const response = await fetch('/api/v2/chat/removeuser', {
|
const response = await fetch('/api/v2/chat/removeuser', {
|
||||||
method: 'DELETE',
|
method: 'DELETE',
|
||||||
});
|
});
|
||||||
const data = await response.json();
|
|
||||||
|
|
||||||
console.log("data", data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user