Compare commits

..

No commits in common. "e80ed8d092f086da4d8a60471920c0b37d3fbdef" and "0cc027252d8312a452e1e08ebcd4a7116e4a691c" have entirely different histories.

17 changed files with 84 additions and 755 deletions

5
.gitignore vendored
View File

@ -40,10 +40,7 @@ WWebJS
.env.development.local .env.development.local
.env.test.local .env.test.local
.env.production.local .env.production.local
.env.save
nano.save
npm-debug.log* npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*

View File

@ -1,494 +0,0 @@
import { Request, Response } from "express";
import { getIO } from "../libs/socket";
import { Op } from "sequelize";
import CreateUserService from "../services/UserServices/CreateUserService";
import UpdateUserService from "../services/UserServices/UpdateUserService";
import DeleteUserService from "../services/UserServices/DeleteUserService";
import { del, get, set } from "../helpers/RedisClient";
import {
startWhoIsOnlineMonitor,
stopWhoIsOnlineMonitor
} from "../helpers/WhoIsOnlineMonitor";
import User from "../models/User";
export const createUser = async (
req: Request,
res: Response
): Promise<Response> => {
const { user_id, user_first_name, user_tax_id, user_email, user_title }: any =
req.body;
const invalid = invalidProperties(req.body, [
"user_id",
"user_tax_id",
"user_first_name"
]);
if (invalid) {
return res.status(400).json(response("1", `${invalid}`, "0", "createUser"));
}
const auxUser = await User.findOne({ where: { secondaryId: user_id } });
if (auxUser) {
return res
.status(400)
.json(
response("1", `The user ${user_id} already exist`, "0", "createUser")
);
}
const user = await CreateUserService({
email: user_tax_id || user_email,
password: "12345",
name: user_first_name,
positionCompany: user_title,
profile: "user",
ignoreThrow: true
});
if (user?.error) {
return res
.status(user?.status)
.json(response("0", `${user?.msg}`, "0", "createUser"));
}
if (!user?.error) {
const _user = await User.findByPk(user.id);
_user?.update({ secondaryId: user_id });
const { id, name } = user;
await set(`user:${id}`, { id, name });
const io = getIO();
io.emit("user", {
action: "create",
user
});
await startWhoIsOnlineMonitor();
}
return res
.status(200)
.json(response("1", `User ${user_id} created`, "1", "createUser"));
};
export const deleteUser = async (
req: Request,
res: Response
): Promise<Response> => {
const { user_id }: any = req.body;
const invalid = invalidProperties(req.body, ["user_id"]);
if (invalid) {
return res.status(400).json(response("1", `${invalid}`, "0", "deleteUser"));
}
const _user = await User.findOne({ where: { secondaryId: user_id } });
if (_user) {
const user = await DeleteUserService(_user.id, true);
if (user?.error) {
return res
.status(user?.status)
.json(response("0", `${user?.msg}`, "0", "deleteUser"));
}
if (!user?.error) {
del(`user:${_user.id}`);
const io = getIO();
io.emit("user", {
action: "delete",
userId: _user.id
});
await stopWhoIsOnlineMonitor();
io.emit("onlineStatus", {
action: "delete",
userOnlineTime: _user.id
});
await startWhoIsOnlineMonitor();
return res
.status(200)
.json(response("1", `User ${user_id} deleted`, "1", "deleteUser"));
}
}
return res
.status(500)
.json(response("0", "Internal server error", "0", "deleteUser"));
};
export const listAllUsers = async (
req: Request,
res: Response
): Promise<Response> => {
const _users: any = await User.findAll({
where: {
secondaryId: {
[Op.ne]: ""
}
},
attributes: ["secondaryId", "name"]
});
if (_users) {
const user_list = _users.map((user: any) => {
const { secondaryId, name } = user;
return { user_id: secondaryId, full_name: name };
});
return res
.status(200)
.json(response("1", "Success", user_list, "listAllUsers"));
}
return res
.status(500)
.json(response("0", "Internal server error", [], "listAllUsers"));
};
export const checkUser = async (
req: Request,
res: Response
): Promise<Response> => {
const { user_id }: any = req.body;
const invalid = invalidProperties(req.body, ["user_id"]);
if (invalid) {
return res.status(400).json(response("1", `${invalid}`, "0", "checkUser"));
}
const _user = await User.findOne({ where: { secondaryId: user_id } });
if (_user) {
return res
.status(200)
.json(response("1", `User ${user_id} exist`, "1", "checkUser"));
}
return res
.status(404)
.json(response("1", `User ${user_id} not exist`, "0", "checkUser"));
};
export const updateUser = async (
req: Request,
res: Response
): Promise<Response> => {
const { user_id, user_first_name, user_tax_id, user_email, user_title }: any =
req.body;
const invalid = invalidProperties(req.body, ["user_id"]);
if (invalid) {
return res.status(400).json(response("1", `${invalid}`, "0", "checkUser"));
}
const _user: any = await User.findOne({ where: { secondaryId: user_id } });
if (!_user)
return res
.status(404)
.json(response("1", `User ${user_id} not exist`, "0", "updateUser"));
const userData = {
email: user_tax_id || user_email,
name: user_first_name,
positionCompany: user_title
};
let user: any = await UpdateUserService({
userData,
userId: _user.id,
ignoreThrow: true
});
if (user?.error) {
return res
.status(user?.status)
.json(response("0", `${user?.msg}`, "0", "updateUser"));
}
if (user) {
const { id, name } = user;
await set(`user:${id}`, { id, name });
}
const io = getIO();
io.emit("user", {
action: "update",
user
});
return res
.status(200)
.json(response("1", `User ${user_id} updated`, "1", "updateUser"));
};
export const resetPassword = async (
req: Request,
res: Response
): Promise<Response> => {
const { user_id, user_password }: any = req.body;
const invalid = invalidProperties(req.body, ["user_id", "user_password"]);
if (invalid) {
return res
.status(400)
.json(response("1", `${invalid}`, "0", "resetPassword"));
}
const _user = await User.findOne({ where: { secondaryId: user_id } });
if (!_user) {
return res
.status(404)
.json(response("1", `User ${user_id} not exist`, "0", "resetPassword"));
}
const userData = {
password: user_password,
email: _user.email
};
let user: any = await UpdateUserService({
userData,
userId: _user.id,
ignoreThrow: true
});
if (user?.error) {
return res
.status(user?.status)
.json(response("0", `${user?.msg}`, "0", "resetPassword"));
}
await logoutUser(_user.id);
return res
.status(200)
.json(
response("1", `User ${user_id} password updated`, "1", "resetPassword")
);
};
export const linkUserAndUserRight = async (
req: Request,
res: Response
): Promise<Response> => {
const { user_id, user_right_id, user_right_title }: any = req.body;
const invalid = invalidProperties(req.body, ["user_id", "user_right_id"]);
if (invalid) {
return res
.status(400)
.json(response("1", `${invalid}`, "0", "linkUserAndUserRight"));
}
if (
(user_right_id &&
!["admin", "user", "supervisor"].includes(
user_right_id?.trim().toLocaleLowerCase()
)) ||
(user_right_title &&
!["admin", "user", "supervisor"].includes(
user_right_title?.trim().toLocaleLowerCase()
))
) {
return res
.status(400)
.json(
response(
"1",
`The user profile ${
user_right_title || user_right_id
} provided by the property user_right_title or user_right_id does not match the following profiles: admin, user, supervisor`,
"0",
"linkUserAndUserRight"
)
);
}
const _user: any = await User.findOne({ where: { secondaryId: user_id } });
if (!_user)
return res
.status(404)
.json(
response("1", `User ${user_id} not exist`, "0", "linkUserAndUserRight")
);
const userData = {
profile: user_right_title || user_right_id,
email: _user.email
};
let user: any = await UpdateUserService({
userData,
userId: _user.id,
ignoreThrow: true
});
if (user?.error) {
return res
.status(user?.status)
.json(response("0", `${user?.msg}`, "0", "linkUserAndUserRight"));
}
await logoutUser(_user.id);
return res
.status(200)
.json(
response(
"1",
`User ${user_id} associated with ${
user_right_title || user_right_id
} profile`,
"1",
"linkUserAndUserRight"
)
);
};
export const checkUserRight = async (
req: Request,
res: Response
): Promise<Response> => {
const { user_id, user_right_id, user_right_title }: any = req.body;
const invalid = invalidProperties(req.body, ["user_id", "user_right_id"]);
if (invalid) {
return res
.status(400)
.json(response("1", `${invalid}`, "0", "checkUserRight"));
}
if (
(user_right_id &&
!["admin", "user", "supervisor"].includes(
user_right_id?.trim().toLocaleLowerCase()
)) ||
(user_right_title &&
!["admin", "user", "supervisor"].includes(
user_right_title?.trim().toLocaleLowerCase()
))
) {
return res
.status(400)
.json(
response(
"1",
`The user profile ${
user_right_title || user_right_id
} provided by the property user_right_title or user_right_id does not match the following profiles: admin, user, supervisor`,
"0",
"checkUserRight"
)
);
}
const _user: any = await User.findOne({
where: {
secondaryId: user_id
}
});
if (!_user)
return res
.status(404)
.json(response("1", `User ${user_id} not exist`, "0", "checkUserRight"));
if (
(user_right_id && _user.profile != user_right_id) ||
(user_right_title && _user.profile != user_right_title)
) {
return res
.status(403)
.json(
response(
"1",
`User ${user_id} does not have this profile`,
"0",
"checkUserRight"
)
);
}
return res
.status(200)
.json(
response(
"1",
`User ${user_id} has ${user_right_title || user_right_id} profile`,
"1",
"checkUserRight"
)
);
};
async function logoutUser(userId: any) {
await stopWhoIsOnlineMonitor();
let onlineTime = {
userId: `${userId}`,
status: "logout..."
};
const io = getIO();
io.emit("onlineStatus", {
action: "logout",
userOnlineTime: onlineTime
});
await startWhoIsOnlineMonitor();
}
function response(code: string, msg: string, obj: any, type: string) {
let payload = { return_code: code, return_msg: msg };
switch (type) {
case "createUser":
return { ...payload, user_created: obj };
case "deleteUser":
return { ...payload, user_removed: obj };
case "listAllUsers":
return { ...payload, user_list: obj };
case "checkUser":
return { ...payload, user_exists: obj };
case "updateUser":
return { ...payload, user_updated: obj };
case "resetPassword":
return { ...payload, password_set: obj };
case "linkUserAndUserRight":
return { ...payload, user_right_linked: obj };
case "checkUserRight":
return { ...payload, user_right_exists: obj };
default:
return payload;
}
}
function invalidProperties(body: any, pros: any[]) {
for (const field of pros) {
console.log("body[field]: ", body[field], " field: ", field);
if (!body[field]) {
return `${field} is required`;
}
}
return false;
}

View File

@ -1,14 +0,0 @@
import { QueryInterface, DataTypes } from "sequelize";
module.exports = {
up: (queryInterface: QueryInterface) => {
return queryInterface.addColumn("Users", "secondaryId", {
type: DataTypes.STRING,
allowNull: true
});
},
down: (queryInterface: QueryInterface) => {
return queryInterface.removeColumn("Users", "secondaryId");
}
};

View File

@ -1,5 +1,5 @@
class AppError { class AppError {
public message: string; public readonly message: string;
public readonly statusCode: number; public readonly statusCode: number;

View File

@ -1,7 +1,6 @@
import { Op } from "sequelize"; import { Op } from "sequelize";
import AppError from "../errors/AppError"; import AppError from "../errors/AppError";
import Ticket from "../models/Ticket"; import Ticket from "../models/Ticket";
import User from "../models/User";
import ListWhatsAppsNumber from "../services/WhatsappService/ListWhatsAppsNumber"; import ListWhatsAppsNumber from "../services/WhatsappService/ListWhatsAppsNumber";
import { getSettingValue } from "./WhaticketSettings"; import { getSettingValue } from "./WhaticketSettings";
import ListWhatsAppsForQueueService from "../services/WhatsappService/ListWhatsAppsForQueueService"; import ListWhatsAppsForQueueService from "../services/WhatsappService/ListWhatsAppsForQueueService";
@ -39,13 +38,8 @@ const CheckContactOpenTickets = async (
if (ticket) { if (ticket) {
if (handle) return true; if (handle) return true;
const userName = await User.findOne({
where:{ id: ticket.userId } throw new AppError("ERR_OTHER_OPEN_TICKET");
});
const error = new AppError("ERR_OTHER_OPEN_TICKET");
error.message = `Erro: já existe um ticket criado com esse contato. Responsável: ${userName? userName.name.toUpperCase() : 'Aguardando'}`;
throw error;
} }

View File

@ -1,23 +0,0 @@
import { Request, Response, NextFunction } from "express";
import AppError from "../errors/AppError";
const verifyAPIKey = (req: Request, res: Response, next: NextFunction): void => {
const authHeader = req.headers.authorization;
if (!authHeader) {
throw new AppError("ERR_SESSION_EXPIRED", 401);
}
const [, token] = authHeader.split(" ");
const apiKeyIsValid = token === process.env.TOKEN_IAM_HORACIUS_EL
if (!apiKeyIsValid) {
throw new AppError(
"Invalid token",
401
);
}
return next();
};
export default verifyAPIKey;

View File

@ -41,13 +41,10 @@ class User extends Model<User> {
@Default(0) @Default(0)
@Column @Column
tokenVersion: number; tokenVersion: number;
@Column @Column
positionCompany: string; positionCompany: string;
@Column
secondaryId: string;
@Default("admin") @Default("admin")
@Column @Column
profile: string; profile: string;
@ -59,9 +56,9 @@ class User extends Model<User> {
updatedAt: Date; updatedAt: Date;
@HasMany(() => Ticket) @HasMany(() => Ticket)
tickets: Ticket[]; tickets: Ticket[];
@HasMany(() => UserOnlineTime) @HasMany(() => UserOnlineTime)
UserOnlineTime: UserOnlineTime[]; UserOnlineTime: UserOnlineTime[];
@BelongsToMany(() => Queue, () => UserQueue) @BelongsToMany(() => Queue, () => UserQueue)
queues: Queue[]; queues: Queue[];

View File

@ -1,56 +0,0 @@
import { Router } from "express";
import * as IAMControllerEL from "../controllers/IAMControllerEL";
import verifyAPIKey from "../middleware/verifyAPIKey";
const iamRoutesEL = Router();
iamRoutesEL.post(
"/iam/horacius/createUser",
verifyAPIKey,
IAMControllerEL.createUser
);
iamRoutesEL.put(
"/iam/horacius/updateUser",
verifyAPIKey,
IAMControllerEL.updateUser
);
iamRoutesEL.delete(
"/iam/horacius/deleteUser",
verifyAPIKey,
IAMControllerEL.deleteUser
);
iamRoutesEL.get(
"/iam/horacius/listAllUsers",
verifyAPIKey,
IAMControllerEL.listAllUsers
);
iamRoutesEL.get(
"/iam/horacius/checkUser",
verifyAPIKey,
IAMControllerEL.checkUser
);
iamRoutesEL.patch(
"/iam/horacius/linkUserAndUserRight",
verifyAPIKey,
IAMControllerEL.linkUserAndUserRight
);
iamRoutesEL.post(
"/iam/horacius/linkUserAndUserRight",
verifyAPIKey,
IAMControllerEL.checkUserRight
);
iamRoutesEL.patch(
"/iam/horacius/resetPassword",
verifyAPIKey,
IAMControllerEL.resetPassword
);
export default iamRoutesEL;

View File

@ -14,12 +14,10 @@ import reportRoutes from "./reportRoutes";
import schedulingNotifiyRoutes from "./SchedulingNotifyRoutes"; import schedulingNotifiyRoutes from "./SchedulingNotifyRoutes";
import statusChatEndRoutes from "./statusChatEndRoutes"; import statusChatEndRoutes from "./statusChatEndRoutes";
import wbotMonitorRoutes from "./wbotMonitorRoutes"; import wbotMonitorRoutes from "./wbotMonitorRoutes";
import iamRoutesEL from "./iamRoutesEL";
const routes = Router(); const routes = Router();
routes.use(iamRoutesEL);
routes.use(userRoutes); routes.use(userRoutes);
routes.use("/auth", authRoutes); routes.use("/auth", authRoutes);
routes.use(settingRoutes); routes.use(settingRoutes);

View File

@ -11,7 +11,6 @@ interface Request {
positionCompany?: string; positionCompany?: string;
queueIds?: number[]; queueIds?: number[];
profile?: string; profile?: string;
ignoreThrow?: boolean;
} }
interface Response { interface Response {
@ -28,27 +27,25 @@ const CreateUserService = async ({
name, name,
positionCompany, positionCompany,
queueIds = [], queueIds = [],
profile = "master", profile = "master"
ignoreThrow = false }: Request): Promise<Response> => {
}: Request): Promise<Response | any> => {
try { try {
const schema = Yup.object().shape({ const schema = Yup.object().shape({
name: Yup.string().required().min(2), name: Yup.string().required().min(2),
email: Yup.string() email: Yup.string().required().trim().test(
.required() "Check-email",
.trim() "An user with this email already exists.",
.test( async value => {
"Check-email", if (!value) return false;
"An user with this email already exists.", const emailExists = await User.findOne({
async value => { where: { email: value }
if (!value) return false; });
const emailExists = await User.findOne({ return !emailExists;
where: { email: value } }
}); ),
return !emailExists;
}
),
// email: Yup.string().email().required().test( // email: Yup.string().email().required().test(
// "Check-email", // "Check-email",
@ -68,8 +65,6 @@ const CreateUserService = async ({
try { try {
await schema.validate({ email, password, name }); await schema.validate({ email, password, name });
} catch (err: any) { } catch (err: any) {
if (ignoreThrow) return { error: true, msg: err.message, status: 400 };
throw new AppError(err.message); throw new AppError(err.message);
} }
@ -91,14 +86,12 @@ const CreateUserService = async ({
const serializedUser = SerializeUser(user); const serializedUser = SerializeUser(user);
return serializedUser; return serializedUser;
} catch (error: any) { } catch (error: any) {
console.error("===> Error on CreateUserService.ts file: \n", error); console.error('===> Error on CreateUserService.ts file: \n', error)
if (ignoreThrow)
return { error: true, msg: "Create user error", status: 500 };
throw new AppError(error.message); throw new AppError(error.message);
} }
}; };
export default CreateUserService; export default CreateUserService;

View File

@ -2,24 +2,14 @@ import User from "../../models/User";
import AppError from "../../errors/AppError"; import AppError from "../../errors/AppError";
import Ticket from "../../models/Ticket"; import Ticket from "../../models/Ticket";
import UpdateDeletedUserOpenTicketsStatus from "../../helpers/UpdateDeletedUserOpenTicketsStatus"; import UpdateDeletedUserOpenTicketsStatus from "../../helpers/UpdateDeletedUserOpenTicketsStatus";
import { set } from "../../helpers/RedisClient"; import { set } from "../../helpers/RedisClient"
const DeleteUserService = async ( const DeleteUserService = async (id: string | number): Promise<void> => {
id: string | number,
ignoreThrow = false
): Promise<void | any> => {
const user = await User.findOne({ const user = await User.findOne({
where: { id } where: { id }
}); });
if (!user) { if (!user) {
if (ignoreThrow)
return {
error: true,
msg: `No user found with this id ${id}`,
status: 404
};
throw new AppError("ERR_NO_USER_FOUND", 404); throw new AppError("ERR_NO_USER_FOUND", 404);
} }

View File

@ -16,7 +16,6 @@ interface UserData {
interface Request { interface Request {
userData: UserData; userData: UserData;
userId: string | number; userId: string | number;
ignoreThrow?: boolean;
} }
interface Response { interface Response {
@ -28,53 +27,41 @@ interface Response {
const UpdateUserService = async ({ const UpdateUserService = async ({
userData, userData,
userId, userId
ignoreThrow = false }: Request): Promise<Response | undefined> => {
}: Request): Promise<Response | undefined | any> => {
try { try {
const user = await ShowUserService(userId); const user = await ShowUserService(userId);
const schema = Yup.object().shape({ const schema = Yup.object().shape({
name: Yup.string().min(2), name: Yup.string().min(2),
// email: Yup.string().min(2), // email: Yup.string().min(2),
profile: Yup.string(), profile: Yup.string(),
password: Yup.string(), password: Yup.string(),
email: Yup.string() email: Yup.string().trim().required().test(
.trim() "Check-email",
.required() "An user with this email already exists.",
.test( async value => {
"Check-email",
"An user with this email already exists.",
async value => {
if (!value) return false;
const emailExists = await User.findOne({ if (!value) return false;
where: { email: value },
raw: true,
attributes: ["email", "id"]
});
if (emailExists && user.id != emailExists?.id) { const emailExists = await User.findOne({ where: { email: value }, raw: true, attributes: ['email', 'id'] });
console.error(
"The email already exists in another user profile!"
);
return !emailExists;
}
return true; if (emailExists && user.id != emailExists?.id) {
console.error('The email already exists in another user profile!')
return !emailExists;
} }
)
return true
}
),
}); });
const { const { email, password, profile, name, positionCompany, queueIds = [] } = userData;
email,
password,
profile,
name,
positionCompany,
queueIds = []
} = userData;
try { try {
await schema.validate({ email, password, profile, name }); await schema.validate({ email, password, profile, name });
@ -82,6 +69,7 @@ const UpdateUserService = async ({
throw new AppError(err.message); throw new AppError(err.message);
} }
await user.update({ await user.update({
email, email,
password, password,
@ -103,18 +91,13 @@ const UpdateUserService = async ({
}; };
return serializedUser; return serializedUser;
} catch (err: any) {
console.error("===> Error on UpdateUserService.ts file: \n", err);
if (ignoreThrow) } catch (error: any) {
return { console.error('===> Error on UpdateUserService.ts file: \n', error)
error: true, throw new AppError(error.message);
msg: err.message,
status: 500
};
throw new AppError(err.message);
} }
}; };
export default UpdateUserService; export default UpdateUserService;

View File

@ -409,7 +409,7 @@ const verifyQueue = async (
//test del transfere o atendimento se entrar na ura infinita //test del transfere o atendimento se entrar na ura infinita
const repet: any = await mostRepeatedPhrase(ticket.id); const repet: any = await mostRepeatedPhrase(ticket.id);
if (repet.occurrences > 10) { if (repet.occurrences > 4) {
await UpdateTicketService({ await UpdateTicketService({
ticketData: { status: "pending", queueId: queues[0].id }, ticketData: { status: "pending", queueId: queues[0].id },
ticketId: ticket.id ticketId: ticket.id
@ -884,7 +884,7 @@ const handleMessage = async (
console.log("repet.occurrences: ", repet.occurrences); console.log("repet.occurrences: ", repet.occurrences);
if (repet.occurrences > 10) { if (repet.occurrences > 4) {
await transferTicket(0, wbot, ticket); await transferTicket(0, wbot, ticket);
await SendWhatsAppMessage({ await SendWhatsAppMessage({

View File

@ -217,76 +217,43 @@ const NotificationsPopOver = () => {
} }
}) })
socket.on('notifyPeding', data =>{
handleNotifications("", data);
});
return () => { return () => {
socket.disconnect() socket.disconnect()
} }
}, [user]) }, [user])
const handleNotifications = (data, notify) => { const handleNotifications = data => {
let isQueue = false; const { message, contact, ticket } = data
if(!notify){
const { message, contact, ticket } = data
const options = { const options = {
body: `${message.body} - ${format(new Date(), "HH:mm")}`, body: `${message.body} - ${format(new Date(), "HH:mm")}`,
icon: contact.profilePicUrl, icon: contact.profilePicUrl,
tag: ticket.id, tag: ticket.id,
renotify: true, renotify: true,
} }
const notification = new Notification( const notification = new Notification(
`${i18n.t("tickets.notification.message")} ${contact.name}`, `${i18n.t("tickets.notification.message")} ${contact.name}`,
options options
)
notification.onclick = e => {
e.preventDefault()
window.focus()
historyRef.current.push(`/tickets/${ticket.id}`)
}
setDesktopNotifications(prevState => {
const notfiticationIndex = prevState.findIndex(
n => n.tag === notification.tag
) )
if (notfiticationIndex !== -1) {
notification.onclick = e => { prevState[notfiticationIndex] = notification
e.preventDefault() return [...prevState]
window.focus()
historyRef.current.push(`/tickets/${ticket.id}`)
} }
return [notification, ...prevState]
})
setDesktopNotifications(prevState => {
const notfiticationIndex = prevState.findIndex(
n => n.tag === notification.tag
)
if (notfiticationIndex !== -1) {
prevState[notfiticationIndex] = notification
return [...prevState]
}
return [notification, ...prevState]
})
}else{
user.queues.forEach(queue =>{
if(queue.id === notify.data.queue?.id){
isQueue = true;
}
})
}
if(!isQueue && notify){
return;
}else{
const notification = new Notification(`${i18n.t("tickets.notification.messagePeding")} ${notify.data.queue?.name}`);
notification.onclick = e => {
e.preventDefault()
window.focus()
historyRef.current.push(`/tickets`)
}
setDesktopNotifications(prevState => {
const notfiticationIndex = prevState.findIndex(
n => n.tag === notification.tag
)
if (notfiticationIndex !== -1) {
prevState[notfiticationIndex] = notification
return [...prevState]
}
return [notification, ...prevState]
})
}
soundAlertRef.current() soundAlertRef.current()
} }

View File

@ -241,7 +241,6 @@ const messages = {
}, },
notification: { notification: {
message: "Message from", message: "Message from",
messagePeding: "new ticket in queue",
}, },
tabs: { tabs: {
open: { title: "Inbox" }, open: { title: "Inbox" },

View File

@ -245,7 +245,6 @@ const messages = {
}, },
notification: { notification: {
message: "Mensaje de", message: "Mensaje de",
messagePeding: "Nuevo billete en cola",
}, },
tabs: { tabs: {
open: { title: "Bandeja" }, open: { title: "Bandeja" },

View File

@ -244,7 +244,6 @@ const messages = {
}, },
notification: { notification: {
message: "Mensagem de", message: "Mensagem de",
messagePeding: "Novo ticket na fila",
}, },
tabs: { tabs: {
open: { title: "Inbox" }, open: { title: "Inbox" },