UNPKG

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.

163 lines (159 loc) 4.75 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // index.ts var index_exports = {}; __export(index_exports, { useFilaExibicaoSenha: () => useFilaExibicaoSenha, usePedidoEventos: () => usePedidoEventos }); module.exports = __toCommonJS(index_exports); // hooks/usePedidoEventos.ts var import_react = require("react"); function usePedidoEventos(props) { var _a; const serverEvents = (0, import_react.useRef)(null); const senhas = (0, import_react.useRef)(null); const [userHash, setUserHash] = (0, import_react.useState)(""); const [, setTick] = (0, import_react.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 var import_react2 = require("react"); function useFilaExibicaoSenha() { const [fila, setFila] = (0, import_react2.useState)([]); const [senhaExibicao, setSenhaExibicao] = (0, import_react2.useState)(null); const adicionarSenhas = (0, import_react2.useCallback)((novas) => { setFila((prev) => [...prev, ...novas]); }, []); const fimExibicao = (0, import_react2.useCallback)(() => { setSenhaExibicao(null); }, []); (0, import_react2.useEffect)(() => { if (senhaExibicao === null && fila.length > 0) { setTimeout(() => { setSenhaExibicao(fila[0]); setFila(fila.slice(1)); }, 0); } }, [senhaExibicao, fila]); return { senhaExibicao, adicionarSenhas, fimExibicao }; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { useFilaExibicaoSenha, usePedidoEventos });