diff --git a/floating.js b/floating.js index ca8c128..07aefb9 100644 --- a/floating.js +++ b/floating.js @@ -3,6 +3,11 @@ const countSpan = document.getElementById('count'); // Atualiza a contagem e a cor do botão quando recebe do main process window.electronAPI.onUpdateCount((value) => { + // Se estiver em atendimento, ignora qualquer atualização de contagem + if (floatButton.classList.contains('em-atendimento')) { + return; + } + countSpan.innerHTML = value ?? 0; // Verifica a contagem para mudar a cor if (value > 0) { @@ -12,6 +17,40 @@ window.electronAPI.onUpdateCount((value) => { } }); +// Altera a cor do botão com base no status do atendimento +window.electronAPI.onAtendimentoStatusChanged((status) => { + if (status === 'iniciado') { + const nomeAtendimento = localStorage.getItem('atendimentoAtualNome'); + floatButton.classList.remove('has-items'); + floatButton.classList.add('em-atendimento'); + countSpan.innerHTML = '-'; // Mostra o hífen + if (nomeAtendimento) { + floatButton.setAttribute('title', `Atendendo: ${nomeAtendimento}`); + } + } else { // 'finalizado' + floatButton.classList.remove('em-atendimento'); + floatButton.setAttribute('title', 'Chamar próximo da fila'); + // Solicita uma atualização imediata da contagem para refletir o estado atual da fila + window.electronAPI.refreshCount(); + } +}); + +// Ao carregar, verifica se já existe um atendimento em andamento +document.addEventListener('DOMContentLoaded', () => { + const atendimentoAtual = localStorage.getItem('atendimentoAtual'); + if (atendimentoAtual) { + const nomeAtendimento = localStorage.getItem('atendimentoAtualNome'); + floatButton.classList.remove('has-items'); + floatButton.classList.add('em-atendimento'); + countSpan.innerHTML = '-'; // Mostra o hífen + if (nomeAtendimento) { + floatButton.setAttribute('title', `Atendendo: ${nomeAtendimento}`); + } + } else { + floatButton.setAttribute('title', 'Chamar próximo da fila'); + } +}); + // Mostra a janela principal ao clicar floatButton.addEventListener('click', () => { window.electronAPI.showMainWindow(); @@ -24,4 +63,4 @@ floatButton.addEventListener('contextmenu', (e) => { }); // Ajuste inicial do cursor -floatButton.style.cursor = 'pointer'; \ No newline at end of file +floatButton.style.cursor = 'pointer'; diff --git a/floating_preload.js b/floating_preload.js index dd8c71b..751fe77 100644 --- a/floating_preload.js +++ b/floating_preload.js @@ -2,6 +2,8 @@ const { contextBridge, ipcRenderer } = require('electron'); contextBridge.exposeInMainWorld('electronAPI', { onUpdateCount: (callback) => ipcRenderer.on('update-count', (_event, value) => callback(value)), + onAtendimentoStatusChanged: (callback) => ipcRenderer.on('atendimento-status-changed', (_event, status) => callback(status)), + refreshCount: () => ipcRenderer.send('refresh-count'), showMainWindow: () => ipcRenderer.send('chamar-fila'), showMenu: () => ipcRenderer.send('show-context-menu') }); \ No newline at end of file diff --git a/main.js b/main.js index c0ed925..ff3547d 100644 --- a/main.js +++ b/main.js @@ -462,10 +462,8 @@ ipcMain.handle('get-count', async () => { // Ouvir pedido para mostrar a janela principal ipcMain.on('chamar-fila', async () => { - const countFila = async () => { - const proximos = JSON.parse(await floatingWin.webContents.executeJavaScript("localStorage.getItem('proximos')")) ?? []; - return proximos.length; - } + // Primeiro, verifica se já existe um atendimento em andamento + const atendimentoAtualId = await floatingWin.webContents.executeJavaScript("localStorage.getItem('atendimentoAtual')"); const showMainWindow = () => { if (mainWin) { @@ -484,6 +482,19 @@ ipcMain.on('chamar-fila', async () => { } } + // Se um atendimento já estiver em andamento, apenas mostra a janela principal. + // A lógica em renderer.js cuidará de exibir a tela de observação. + if (atendimentoAtualId) { + showMainWindow(); + return; // Interrompe a execução aqui + } + + // Se não houver atendimento em andamento, continua com a lógica original. + const countFila = async () => { + const proximos = JSON.parse(await floatingWin.webContents.executeJavaScript("localStorage.getItem('proximos')")) ?? []; + return proximos.length; + } + const requestData = async () => { @@ -583,6 +594,14 @@ ipcMain.on('chamar-fila', async () => { }); +// Ouve um pedido da janela flutuante para forçar a atualização da contagem +ipcMain.on('refresh-count', async () => { + if (floatingWin) { + const proximos = JSON.parse(await floatingWin.webContents.executeJavaScript("localStorage.getItem('proximos')")) ?? []; + floatingWin.webContents.send('update-count', proximos.length); + } +}); + ipcMain.on('select-atend-id', (itemId) => { selectedItemId = itemId; console.log(selectedItemId); @@ -632,6 +651,20 @@ ipcMain.on('iniciar-atendimento', async (event, itemId) => { // A janela principal já mudou a UI ao enviar o evento 'next-step' }); +// Ouve quando um atendimento é iniciado e notifica a janela flutuante +ipcMain.on('atendimento-iniciado', (event, itemId) => { + if (floatingWin) { + floatingWin.webContents.send('atendimento-status-changed', 'iniciado'); + } +}); + +// Ouve quando um atendimento é finalizado e notifica a janela flutuante +ipcMain.on('atendimento-finalizado', () => { + if (floatingWin) { + floatingWin.webContents.send('atendimento-status-changed', 'finalizado'); + } +}); + // Ouvir clique no botão "Salvar" ipcMain.on('save-observation', async (event, { itemId, observation }) => { diff --git a/preload.js b/preload.js index 7e94212..c1c811f 100644 --- a/preload.js +++ b/preload.js @@ -14,6 +14,10 @@ contextBridge.exposeInMainWorld('electronAPI', { //inicia o atendimento atual iniciaAtendimento: (itemId) => ipcRenderer.send('iniciar-atendimento', itemId), + //notifica sobre o status do atendimento + atendimentoIniciado: (itemId) => ipcRenderer.send('atendimento-iniciado', itemId), + atendimentoFinalizado: () => ipcRenderer.send('atendimento-finalizado'), + showObservation: (callback) => ipcRenderer.on('show-observation', (_event) => callback() ), //salva a observação do atendimento saveObservation: (data) => ipcRenderer.send('save-observation', data), diff --git a/renderer.js b/renderer.js index c52d4bf..d545fe8 100644 --- a/renderer.js +++ b/renderer.js @@ -91,7 +91,11 @@ window.electronAPI.selectAtendID((data) => { // Reseta a view para a lista sempre que os dados são carregados ao clicar no botão para abrir a janela populateList(data); showListView(); + + // Garante que o item selecionado (ID e Nome) seja o que veio da chamada, sobrescrevendo o da lista. selectedItemId = data.id ?? null; + selectedItemName = data.clientName ?? ''; + //data.senhaGen queueNumber.innerHTML = data ? `NA VEZ: ${data.clientName.toUpperCase()} - ${data.descricaoServico.toUpperCase()}` : 'Ninguem aguardando atendimento'; selectedItemNameSpan.innerHTML = data ? ` ${data.clientName.toUpperCase()} [ ${data.senhaGen} ]` : 'Ninguem aguardando atendimento'; @@ -104,6 +108,16 @@ window.electronAPI.showObservation(() => { // Função para popular a lista de itens function populateList(currentData) { + const atendimentoEmAndamentoId = localStorage.getItem('atendimentoAtual'); + const atendimentoEmAndamentoNome = localStorage.getItem('atendimentoAtualNome'); + + if (atendimentoEmAndamentoId) { + itemList.innerHTML = `
  • Atendimento com ${(atendimentoEmAndamentoNome || '').toUpperCase()} em andamento.
  • `; + queueNumber.innerHTML = `EM ATENDIMENTO: ${(atendimentoEmAndamentoNome || '').toUpperCase()}`; + nextButton.disabled = true; + return; + } + let datastorage = localStorage.getItem('proximos'); // Adiciona os outros itens apenas para visualização (opcional) @@ -142,6 +156,19 @@ function populateList(currentData) { } +// Verifica o estado ao carregar a janela +document.addEventListener('DOMContentLoaded', () => { + const atendimentoEmAndamentoId = localStorage.getItem('atendimentoAtual'); + if (atendimentoEmAndamentoId) { + // Se um atendimento está em andamento, a tela de observação deve ser mostrada + selectedItemId = atendimentoEmAndamentoId; + selectedItemName = localStorage.getItem('atendimentoAtualNome'); + selectedItemNameSpan.innerHTML = ` ${(selectedItemName || '').toUpperCase()} `; + showObservationView(); + } +}); + + //mostra a tela de listagem e permite iniciar o atendimento function showListView() { listView.style.display = 'block'; @@ -163,6 +190,12 @@ function showObservationView() { // // Evento do botão "Iniciar atendimento" nextButton.addEventListener('click', () => { if (selectedItemId !== null) { + // Salva o estado de atendimento no localStorage + localStorage.setItem('atendimentoAtual', selectedItemId); + localStorage.setItem('atendimentoAtualNome', selectedItemName); + + // Notifica o main process e muda a view + window.electronAPI.atendimentoIniciado(selectedItemId); window.electronAPI.iniciaAtendimento(selectedItemId); showObservationView(); // Muda para a tela de observação } else { @@ -181,6 +214,11 @@ logoutButton.addEventListener('click', () => { saveButton.addEventListener('click', () => { const observation = observationText.value; if (selectedItemId !== null) { + // Limpa o estado de atendimento + localStorage.removeItem('atendimentoAtual'); + localStorage.removeItem('atendimentoAtualNome'); + window.electronAPI.atendimentoFinalizado(); + window.electronAPI.saveObservation({ itemId: selectedItemId, observation: observation }); window.location.reload(); } diff --git a/style.css b/style.css index 2f8f168..7d17be8 100644 --- a/style.css +++ b/style.css @@ -78,6 +78,13 @@ body#floating{ animation: pulse-border .5s infinite; } +/* Nova classe para quando estiver em atendimento */ +#float-button.em-atendimento { + background-color: var(--danger-color); /* Vermelho */ + border: 4px solid var(--dark-danger-color); + animation: pulse-border .2s infinite; /* Pulso mais rápido */ +} + @keyframes pulse-border { 0% { border-color: var(--medium-gold);