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 = `