correções na tela de login colab
This commit is contained in:
parent
624b6a7268
commit
99b34b2871
|
|
@ -7,7 +7,7 @@
|
||||||
default-src 'self';
|
default-src 'self';
|
||||||
script-src 'self' 'unsafe-inline';
|
script-src 'self' 'unsafe-inline';
|
||||||
style-src 'self' 'unsafe-inline';
|
style-src 'self' 'unsafe-inline';
|
||||||
connect-src 'self' ws://localhost:3000 http://localhost:3000;
|
connect-src 'self' ws://localhost:3000 http://localhost:3000 ws://autoatends.linco.work wss://autoatends.linco.work;
|
||||||
">
|
">
|
||||||
<title>Tela de Atendimento</title>
|
<title>Tela de Atendimento</title>
|
||||||
<link rel="stylesheet" href="style.css">
|
<link rel="stylesheet" href="style.css">
|
||||||
|
|
|
||||||
|
|
@ -34,14 +34,14 @@
|
||||||
//o campo username deve ser formatado como cpf ou cnpj
|
//o campo username deve ser formatado como cpf ou cnpj
|
||||||
function formatarCampoCPFCNPJ() {
|
function formatarCampoCPFCNPJ() {
|
||||||
var campo = document.getElementById('username');
|
var campo = document.getElementById('username');
|
||||||
var valor = campo.value.replace(/\D/g, ''); // Remove todos os caracteres não numéricos
|
var valor = campo.value.replace(/[^a-zA-Z0-9]/g, ''); // Remove apenas o que não for alfanumérico
|
||||||
|
|
||||||
if (valor.length <= 11) {
|
if (valor.length <= 11) {
|
||||||
// Formata como CPF
|
// Formata como CPF
|
||||||
valor = valor.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-$4');
|
valor = valor.replace(/([a-zA-Z0-9]{3})([a-zA-Z0-9]{3})([a-zA-Z0-9]{3})([a-zA-Z0-9]{2})/, '$1.$2.$3-$4');
|
||||||
} else {
|
} else {
|
||||||
// Formata como CNPJ
|
// Formata como CNPJ
|
||||||
valor = valor.replace(/(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/, '$1.$2.$3/$4-$5');
|
valor = valor.replace(/([a-zA-Z0-9]{2})([a-zA-Z0-9]{3})([a-zA-Z0-9]{3})([a-zA-Z0-9]{4})([a-zA-Z0-9]{2})/, '$1.$2.$3/$4-$5');
|
||||||
}
|
}
|
||||||
campo.value = valor;
|
campo.value = valor;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
93
main.js
93
main.js
|
|
@ -15,10 +15,10 @@ let updateWin;
|
||||||
const dataPath = path.join(__dirname, 'data.json'); // Caminho para o JSON (backup local)
|
const dataPath = path.join(__dirname, 'data.json'); // Caminho para o JSON (backup local)
|
||||||
const settingsPath = path.join(app.getPath('userData'), 'settings.json'); // Caminho para as configurações
|
const settingsPath = path.join(app.getPath('userData'), 'settings.json'); // Caminho para as configurações
|
||||||
|
|
||||||
//! API
|
//! api
|
||||||
const apiUrl = 'http://localhost:3000/api/'; // Adaptado para NestJS
|
const apiUrl = 'https://aapi.linco.work/';
|
||||||
//! pusher
|
//! pusher
|
||||||
const pusherUrl = 'http://localhost:3000'; // Agora aponta para o Socket.io (NestJS)
|
const pusherUrl = apiUrl;
|
||||||
|
|
||||||
autoUpdater.autoDownload = false;
|
autoUpdater.autoDownload = false;
|
||||||
autoUpdater.autoInstallOnAppQuit = true;
|
autoUpdater.autoInstallOnAppQuit = true;
|
||||||
|
|
@ -113,7 +113,7 @@ async function getFirstData() {
|
||||||
|
|
||||||
const token = await getAuthToken();
|
const token = await getAuthToken();
|
||||||
const colabId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('idOperator')")
|
const colabId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('idOperator')")
|
||||||
const tenantId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('tenantId')")
|
const tenantId = await getTenantId();
|
||||||
const url = apiUrl + 'attendance/next-in-line/' + colabId;
|
const url = apiUrl + 'attendance/next-in-line/' + colabId;
|
||||||
|
|
||||||
//! checa se o token e o colabId existem
|
//! checa se o token e o colabId existem
|
||||||
|
|
@ -199,6 +199,29 @@ async function getAuthToken() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Função para verificar o tenantId no localStorage
|
||||||
|
async function getTenantId() {
|
||||||
|
const checkWindow = async (win) => {
|
||||||
|
if (win && !win.isDestroyed()) {
|
||||||
|
try {
|
||||||
|
const val = await win.webContents.executeJavaScript('localStorage.getItem("tenantId");');
|
||||||
|
return (val && val !== 'null' && val !== 'undefined') ? val : null;
|
||||||
|
} catch (e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Prioridade para janelas visíveis
|
||||||
|
let id = await checkWindow(operatorWin);
|
||||||
|
if (!id) id = await checkWindow(mainWin);
|
||||||
|
if (!id) id = await checkWindow(floatingWin);
|
||||||
|
if (!id) id = await checkWindow(loginWin);
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
// Função para criar a janela de login
|
// Função para criar a janela de login
|
||||||
function createLoginWindow() {
|
function createLoginWindow() {
|
||||||
loginWin = new BrowserWindow({
|
loginWin = new BrowserWindow({
|
||||||
|
|
@ -550,7 +573,7 @@ ipcMain.on('chamar-fila', async () => {
|
||||||
|
|
||||||
const colabId = await getSelectedOperatorId();
|
const colabId = await getSelectedOperatorId();
|
||||||
const token = await getAuthToken();
|
const token = await getAuthToken();
|
||||||
const tenantId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('tenantId')")
|
const tenantId = await getTenantId();
|
||||||
const url = apiUrl + 'attendance/call-next/' + colabId;
|
const url = apiUrl + 'attendance/call-next/' + colabId;
|
||||||
|
|
||||||
const request = net.request({
|
const request = net.request({
|
||||||
|
|
@ -664,7 +687,7 @@ ipcMain.on('select-atend-id', (itemId) => {
|
||||||
ipcMain.on('iniciar-atendimento', async (event, itemId) => {
|
ipcMain.on('iniciar-atendimento', async (event, itemId) => {
|
||||||
|
|
||||||
const token = await getAuthToken();
|
const token = await getAuthToken();
|
||||||
const tenantId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('tenantId')")
|
const tenantId = await getTenantId();
|
||||||
const url = apiUrl + 'attendance/' + itemId + '/start';
|
const url = apiUrl + 'attendance/' + itemId + '/start';
|
||||||
|
|
||||||
// envio de uma solicitação POST com o ID do item
|
// envio de uma solicitação POST com o ID do item
|
||||||
|
|
@ -713,7 +736,7 @@ ipcMain.on('save-observation', async (event, { itemId, observation }) => {
|
||||||
console.log(`Salvando observação para item ${itemId}: ${observation}`);
|
console.log(`Salvando observação para item ${itemId}: ${observation}`);
|
||||||
|
|
||||||
const token = await getAuthToken();
|
const token = await getAuthToken();
|
||||||
const tenantId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('tenantId')")
|
const tenantId = await getTenantId();
|
||||||
const url = apiUrl + 'attendance/' + itemId + '/finish';
|
const url = apiUrl + 'attendance/' + itemId + '/finish';
|
||||||
|
|
||||||
const fmData = JSON.stringify({
|
const fmData = JSON.stringify({
|
||||||
|
|
@ -761,7 +784,6 @@ ipcMain.on('logout', () => {
|
||||||
localStorage.removeItem("selectedOperator");
|
localStorage.removeItem("selectedOperator");
|
||||||
localStorage.removeItem("salaOperator");
|
localStorage.removeItem("salaOperator");
|
||||||
localStorage.removeItem("servicosOperator");
|
localStorage.removeItem("servicosOperator");
|
||||||
localStorage.removeItem("tenantId");
|
|
||||||
`).then(() => {
|
`).then(() => {
|
||||||
// Fecha a janela main e abre a janela de operador e inicia o aplicativo
|
// Fecha a janela main e abre a janela de operador e inicia o aplicativo
|
||||||
mainWin.hide();
|
mainWin.hide();
|
||||||
|
|
@ -796,10 +818,15 @@ ipcMain.on('login-attempt', async (event, credentials) => {
|
||||||
const data = JSON.parse(responseData);
|
const data = JSON.parse(responseData);
|
||||||
|
|
||||||
if (data.access_token) {
|
if (data.access_token) {
|
||||||
|
// Tenta encontrar o tenantId em diferentes locais possíveis da resposta
|
||||||
|
const tenantId = data.tenantId || (data.user && data.user.tenantId) || (data.user && data.user.tenant_id);
|
||||||
|
|
||||||
|
console.log(`Login bem-sucedido. Token presente. TenantId encontrado: ${tenantId}`);
|
||||||
|
|
||||||
// Login bem-sucedido
|
// Login bem-sucedido
|
||||||
loginWin.webContents.executeJavaScript(`
|
loginWin.webContents.executeJavaScript(`
|
||||||
localStorage.setItem("authToken", "${data.access_token}");
|
localStorage.setItem("authToken", "${data.access_token}");
|
||||||
localStorage.setItem("tenantId", "${data.user.tenantId}");
|
localStorage.setItem("tenantId", "${tenantId || ''}");
|
||||||
`).then(() => {
|
`).then(() => {
|
||||||
// Fecha a janela de login e abre a de seleção de operador
|
// Fecha a janela de login e abre a de seleção de operador
|
||||||
event.reply('login-response', { success: true });
|
event.reply('login-response', { success: true });
|
||||||
|
|
@ -830,8 +857,11 @@ ipcMain.on('login-attempt', async (event, credentials) => {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Remove máscara do login (CPF/CNPJ) antes de enviar para a API
|
||||||
|
const cleanLogin = credentials.login.replace(/[.\-\/]/g, '');
|
||||||
|
|
||||||
// Envia as credenciais
|
// Envia as credenciais
|
||||||
request.write(JSON.stringify({ login: credentials.login, password: credentials.password }));
|
request.write(JSON.stringify({ login: cleanLogin, password: credentials.password }));
|
||||||
request.end();
|
request.end();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
event.reply('login-response', {
|
event.reply('login-response', {
|
||||||
|
|
@ -870,6 +900,9 @@ ipcMain.handle('get-operators', async () => {
|
||||||
try {
|
try {
|
||||||
// Verifica se existe token de autenticação
|
// Verifica se existe token de autenticação
|
||||||
const token = await getAuthToken();
|
const token = await getAuthToken();
|
||||||
|
const tenantId = await getTenantId();
|
||||||
|
|
||||||
|
console.log(`Buscando operadores - TenantId: ${tenantId}, Token presente: ${!!token}`);
|
||||||
|
|
||||||
if (!token) {
|
if (!token) {
|
||||||
return {
|
return {
|
||||||
|
|
@ -881,26 +914,44 @@ ipcMain.handle('get-operators', async () => {
|
||||||
|
|
||||||
const route = apiUrl + 'collaborators';
|
const route = apiUrl + 'collaborators';
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve) => {
|
||||||
|
const headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': `Bearer ${token}`
|
||||||
|
};
|
||||||
|
|
||||||
|
// Garante que o tenantId é uma string válida e não "null" ou "undefined"
|
||||||
|
if (tenantId && tenantId !== 'null' && tenantId !== 'undefined') {
|
||||||
|
headers['x-tenant-id'] = tenantId;
|
||||||
|
}
|
||||||
|
|
||||||
const request = net.request({
|
const request = net.request({
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
url: route,
|
url: route,
|
||||||
headers: {
|
headers: headers
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'Authorization': `Bearer ${token}`
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
let responseData = '';
|
let responseData = '';
|
||||||
|
|
||||||
request.on('response', (response) => {
|
request.on('response', (response) => {
|
||||||
|
let body = '';
|
||||||
response.on('data', (chunk) => {
|
response.on('data', (chunk) => {
|
||||||
responseData += chunk.toString();
|
body += chunk.toString();
|
||||||
});
|
});
|
||||||
|
|
||||||
response.on('end', () => {
|
response.on('end', () => {
|
||||||
|
if (response.statusCode !== 200) {
|
||||||
|
console.error(`Erro na API (${response.statusCode}):`, body);
|
||||||
|
resolve({
|
||||||
|
success: false,
|
||||||
|
message: `Erro ${response.statusCode}: ${body}`,
|
||||||
|
operators: []
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const data = JSON.parse(responseData);
|
const data = JSON.parse(body);
|
||||||
|
|
||||||
if (Array.isArray(data)) {
|
if (Array.isArray(data)) {
|
||||||
const operators = data.map(colab => ({
|
const operators = data.map(colab => ({
|
||||||
|
|
@ -915,14 +966,14 @@ ipcMain.handle('get-operators', async () => {
|
||||||
operators: operators
|
operators: operators
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
reject({
|
resolve({
|
||||||
success: false,
|
success: false,
|
||||||
message: 'Erro ao obter a lista de colaboradores',
|
message: 'Resposta da API não é uma lista válida',
|
||||||
operators: []
|
operators: []
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
reject({
|
resolve({
|
||||||
success: false,
|
success: false,
|
||||||
message: 'Erro ao processar resposta do servidor',
|
message: 'Erro ao processar resposta do servidor',
|
||||||
operators: []
|
operators: []
|
||||||
|
|
@ -932,7 +983,7 @@ ipcMain.handle('get-operators', async () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
request.on('error', (error) => {
|
request.on('error', (error) => {
|
||||||
reject({
|
resolve({
|
||||||
success: false,
|
success: false,
|
||||||
message: `Erro de conexão: ${error.message}`,
|
message: `Erro de conexão: ${error.message}`,
|
||||||
operators: []
|
operators: []
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue