pwi-kdsmobile-hooks
Version:
Biblioteca de React Hooks para acompanhamento em tempo real de pedidos e exibição sequencial de senhas, ideal para sistemas de atendimento, painéis e aplicações que precisam consumir eventos do backend de forma simples e tipada.
135 lines (133 loc) • 3.53 kB
JavaScript
// hooks/usePedidoEventos.ts
import { useRef, useState } from "react";
function usePedidoEventos(props) {
var _a;
const serverEvents = useRef(null);
const senhas = useRef(null);
const [userHash, setUserHash] = useState("");
const [, setTick] = useState(0);
function iniciar(tipoEvento) {
switch (tipoEvento) {
case "sse": {
serverEvents.current = new EventSource(
`${props.eventSourceUrl}/v1/pedido/events/sse?token=${props.token}`
);
break;
}
case "ws": {
serverEvents.current = new WebSocket(
`${props.eventSourceUrl}/v1/pedido/events/ws?token=${props.token}`
);
break;
}
default: {
props.onError({
errorID: "FHPEINI001",
msg: `Origem de eventos n\xE3o suportada: ${tipoEvento}`
});
return;
}
}
serverEvents.current.onmessage = (event) => {
var _a2;
const eventOk = handleServerEvent(event.data);
if (typeof eventOk === "object" && eventOk !== null && "errorID" in eventOk) {
(_a2 = serverEvents.current) == null ? void 0 : _a2.close();
props.onError(eventOk);
}
};
}
function handleServerEvent(data) {
let event;
try {
event = JSON.parse(data);
} catch (err) {
return {
errorID: "FHPEHSE001",
msg: "Erro ao receber a atualiza\xE7\xE3o do pedido"
};
}
switch (event.request) {
case "atualizacao-pedido": {
if (event.senhas) {
return handleAtualizacaoPedido(event.senhas);
}
break;
}
case "user-hash": {
if (event.userHash) setUserHash(event.userHash);
break;
}
case "erro": {
if (event.erro) {
return {
errorID: event.erro.errorID,
msg: event.erro.msg
};
}
break;
}
}
return true;
}
function handleAtualizacaoPedido(senhasNovas) {
if (senhas.current === null) {
setTick((t) => ++t);
senhas.current = [...senhasNovas];
return true;
}
const novasParaExibir = [];
for (const senhaNova of senhasNovas) {
const senhaVelha = senhas.current.find(
(item) => item.senha === senhaNova.senha
);
if (senhaVelha === void 0) {
novasParaExibir.push(senhaNova);
continue;
}
if (senhaVelha.status !== senhaNova.status) {
novasParaExibir.push(senhaNova);
}
}
setTick((t) => ++t);
senhas.current = senhasNovas;
if (novasParaExibir.length > 0) {
props.onSenhasParaExibir(novasParaExibir);
}
return true;
}
return {
iniciar,
userHash,
senhas: [...(_a = senhas.current) != null ? _a : []]
};
}
// hooks/useFilaExibicaoSenha.ts
import { useEffect, useState as useState2, useCallback } from "react";
function useFilaExibicaoSenha() {
const [fila, setFila] = useState2([]);
const [senhaExibicao, setSenhaExibicao] = useState2(null);
const adicionarSenhas = useCallback((novas) => {
setFila((prev) => [...prev, ...novas]);
}, []);
const fimExibicao = useCallback(() => {
setSenhaExibicao(null);
}, []);
useEffect(() => {
if (senhaExibicao === null && fila.length > 0) {
setTimeout(() => {
setSenhaExibicao(fila[0]);
setFila(fila.slice(1));
}, 0);
}
}, [senhaExibicao, fila]);
return {
senhaExibicao,
adicionarSenhas,
fimExibicao
};
}
export {
useFilaExibicaoSenha,
usePedidoEventos
};