From 8b5c940976aa4bf9a2b8be285d37006a73a4644c Mon Sep 17 00:00:00 2001 From: developer1054 Date: Thu, 23 Oct 2025 15:30:48 -0300 Subject: [PATCH 1/2] rotas --- src/App.tsx | 9 ++++++- src/components/FullScreenLoader.tsx | 35 ++++++++++++++++++++++++++ src/pages/Index.tsx | 39 ++++++++++++++++++----------- src/pages/Redirect.tsx | 10 ++++++++ 4 files changed, 77 insertions(+), 16 deletions(-) create mode 100644 src/components/FullScreenLoader.tsx create mode 100644 src/pages/Redirect.tsx diff --git a/src/App.tsx b/src/App.tsx index a09c767..c06f45b 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -6,6 +6,7 @@ import { BrowserRouter, Routes, Route } from "react-router-dom"; import { ThemeProvider } from "next-themes"; import Index from "./pages/Index"; import NotFound from "./pages/NotFound"; +import Redirect from "./pages/Redirect"; const queryClient = new QueryClient(); @@ -17,9 +18,15 @@ const App = () => ( - } /> + } + /> + + } /> {/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */} } /> + } /> diff --git a/src/components/FullScreenLoader.tsx b/src/components/FullScreenLoader.tsx new file mode 100644 index 0000000..aed2a98 --- /dev/null +++ b/src/components/FullScreenLoader.tsx @@ -0,0 +1,35 @@ +import { Loader2 } from "lucide-react"; +import { useEffect, useState } from "react"; + +interface FullScreenLoaderProps { + show: boolean; + text?: string; +} + +export default function FullScreenLoader({ show, text = "Carregando..." }: FullScreenLoaderProps) { + const [visible, setVisible] = useState(show); + + useEffect(() => { + if (show) setVisible(true); + else { + // adiciona um pequeno atraso para suavizar o fade-out + const timeout = setTimeout(() => setVisible(false), 200); + return () => clearTimeout(timeout); + } + }, [show]); + + if (!visible && !show) return null; + + return ( +
+
+ +

{text}

+
+
+ ); +} diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index e4d59f2..0bbacf8 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -7,6 +7,7 @@ import { GenerationView } from "@/components/audio/GenerationView"; import { BotView } from "@/components/bots/BotView"; import { BotChat } from "@/components/bots/BotChat"; import { AgentView } from "@/components/agent/AgentView"; +import { Navigate, Route, Routes } from "react-router-dom"; interface Bot { id: string; @@ -27,21 +28,29 @@ const Index = () => { setActiveBotChat(null); }; - return ( - - {activeView === "chat" && } - {activeView === "images" && } - {activeView === "transcription" && } - {activeView === "generation" && } - {activeView === "bots" && ( - activeBotChat ? ( - - ) : ( - - ) - )} - {activeView === "agent" && } - + return ( + } /> + + + {activeView === "chat" && } + {activeView === "images" && } + {activeView === "transcription" && } + {activeView === "generation" && } + {activeView === "bots" && ( + activeBotChat ? ( + + ) : ( + + ) + )} + {activeView === "agent" && } + + } /> + + + + ); }; diff --git a/src/pages/Redirect.tsx b/src/pages/Redirect.tsx new file mode 100644 index 0000000..be5a203 --- /dev/null +++ b/src/pages/Redirect.tsx @@ -0,0 +1,10 @@ +import FullScreenLoader from "@/components/FullScreenLoader"; + + + +export default function Redirect() { + + return ( + + ); +} -- 2.52.0 From c8c2ca8c5ba14196e2e1892fffd24024e54ac8c3 Mon Sep 17 00:00:00 2001 From: developer1054 Date: Thu, 23 Oct 2025 16:58:21 -0300 Subject: [PATCH 2/2] integracao-core --- .env.example | 3 + index.html | 8 +- package-lock.json | 9 + package.json | 1 + public/favicon.ico | Bin 7645 -> 2966 bytes public/favicon.png | Bin 0 -> 28787 bytes public/favicon2.ico | Bin 0 -> 7645 bytes src/App.tsx | 16 +- src/GlobalFunctions.ts | 286 ++++++++++++++++++++++++++++ src/components/FullScreenLoader.tsx | 2 +- src/components/Layout.tsx | 3 +- src/pages/Index.tsx | 1 + src/pages/Redirect.tsx | 38 ++++ src/pages/RedirectService.ts | 34 ++++ src/services/audioGeneration.ts | 5 +- src/services/chat.ts | 5 +- src/services/imageGeneration.ts | 5 +- src/services/transcription.ts | 5 +- src/vite-env.d.ts | 3 + 19 files changed, 408 insertions(+), 16 deletions(-) create mode 100644 public/favicon.png create mode 100644 public/favicon2.ico create mode 100644 src/GlobalFunctions.ts create mode 100644 src/pages/RedirectService.ts diff --git a/.env.example b/.env.example index b0e0288..ec05419 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,9 @@ # API Configuration # Base URL da API do HGTX VITE_API_BASE_URL=https://prod-hgtx-intelligence-n8n.hgtx.com.br +VITE_BASE_URL_OPEN_CODEX_APIs=https://codex-api.hgtx.com.br/api/ +VITE_BASE_URL_HGTX_CORE_API=https://core-api.hgtx.com.br/api/ +VITE_BASE_URL_HGTX_CORE=https://core.hgtx.com.br/ # API Key para autenticação # IMPORTANTE: Mantenha esta chave segura e não compartilhe publicamente diff --git a/index.html b/index.html index 3b041b8..1513c1c 100644 --- a/index.html +++ b/index.html @@ -1,5 +1,5 @@ - + @@ -10,11 +10,11 @@ - + - - + + diff --git a/package-lock.json b/package-lock.json index fc7bedc..6a27f24 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "date-fns": "^3.6.0", "embla-carousel-react": "^8.6.0", "input-otp": "^1.4.2", + "jwt-decode": "^4.0.0", "lucide-react": "^0.462.0", "next-themes": "^0.3.0", "react": "^18.3.1", @@ -4828,6 +4829,14 @@ "dev": true, "license": "MIT" }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "engines": { + "node": ">=18" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", diff --git a/package.json b/package.json index 2ecde5e..e7982a7 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "date-fns": "^3.6.0", "embla-carousel-react": "^8.6.0", "input-otp": "^1.4.2", + "jwt-decode": "^4.0.0", "lucide-react": "^0.462.0", "next-themes": "^0.3.0", "react": "^18.3.1", diff --git a/public/favicon.ico b/public/favicon.ico index dd5a12627d36db7eb9c19fa2f931ff1509f0323e..70c2a8f3dbc2645c988a7d988baa28506693f645 100644 GIT binary patch literal 2966 zcmds3c~p~E7Jo^A07=*hiL6=J0tsPPC|S_pF+~g#c0vRMWE%yP5rqL!kL-(jL_x4F zP+HJq7u#`g6x-3x=p1XUc&5jpgNk)w6c9xq32*Ml6#i-FKj)8`mvg_je80QBd%t^w z5D9*6Ohi0UH4PzHA}=5}AYUNjd~v|L|AjF;Jd7~LsJOV;RH0DV2LuGHkjv$^DJdx? z#Cca&*MG&0&6_u)y1F{DSS%JeIy&yMva-5pVPWyTjg8GUXJ_XRe0+RL)N1vr?(S~W z%F0Ug;K74;W`{^5LQ<*Jg2iH$nVFeAFfuY)pwsE!g5DBep(w;l;>L{6%-42SlQ zJ~Jt=JGgj9|H**r%H623p^hXA6`J@9JgClMDVb+$^{a4!K!8F+L#@Hj4$!LudTVcQ z-y9qg63lX7WqUfYPsaqh59UVtU)Yx*YwRgblnxJcntaoF;1}}F(70IRz8-$8& zVVt&Ia*r<#Z1BI>kt#WHep`a(`(u@Mhol^YpWj*J4G#}T5LY8>YwKDHg<=5Gf$qJ0 zzWX``jrL7A-_cMa^Tfp~opFJfiMIx^aZQw9qQ6kp^rXMd=5Ou07v&InF_00AE|sol z9aFir?~|{1)u{Bs)iN&L7UY1p1~Tz(2~T$-J@U$TO*=vw97za2x`U`xDq^$Q3h;RX z1Yx-IbDn$;C7h4E$7kbmsXNwqT1_W%84nYAjHmH#<~p@273cZc8%}2_x~9H7Wc~N9 za&$ra9{Q?S&FbF3?Qe`^Ewn}paIVO9KAuPa3Fx7kOM4UNLd6=s1+I-2-?`Dc-S5-V z1O)kHLZi`o3EklPl#7c?Jj0y+dzOVc-VrHS*d%heuqnh{krOWBY?1hRYy4feCGjjD zC32{^B$#P9SD-wGht61h{+rdzlN-1nH%6{lXp8p2`TndCjh{N0 zohML5b|SzK(gwRLH~ZR-7WrA>`qhs5t2?6FJ}p|ewn5?YQ}cRXoEPYLKRd)-Mg?rk zu3~iOFV|7B*a>Y>1i2=9*<6ovHNm?gxD&&Nwy%X)$B{uFK#99=gFTT{SRLd(+ms~R zSf>g^pR^x=qkoU);tXUB%hJ_8?^lMiA2v(O@Q1Osy4$-{hq`m3bMr!7|EvjdU&8{- zfs&k`xez*k^dMSihfsQ;YgRnR%#aVcbZt*YE%=;IB9RP0*wWIn0%Flc0{sc0UQfTM z(h7P?)yp!L7ByQl(Jk0C$M~%8R5HfSMqA;p)5P#e^Hx>8@f%)hkwGEad9iLhXw}j76)@RnuU-^(WGtjgIU!GG%ER?m9r%=0@&s0gc_)%+K zmxF`DI>@_e0AcXG6TXE~GKq{=STXSabk$CR`R(nC%QF5@AV+^HQ(2yl<+eAiVa@N3 z4(|9kMV|jdM#$4=*@5`Y_Q<*U)-83@mwL@#pKV>{tJKD#tG92GlZEW2B(6FBJX@}t zIbKr4=kr}nOibro$c6R5!$T18c>DXw(_16P4cnzyU!$6P+fm#!@=>cDzI+&IWx+_JRGOst zIcrn+jDH?g3GvIO%pYE#tnh-mL4q3JLfk*(;T+tDmT6~KO(ByF#$+;<`*2?L6vp>H zZY$jRd~fppud>5$9N*}x-zN9Mo@~1(c1)(4s6F>DT_sIb#cSt(xBkV#{#dMU*63fh zKAr(K_7mpwBQRCOODOlg4otr(JckpFzJ!9fzHBu^-i!p+}lWA;h z{ED!F!C;&XTeZr|fypeOnVEfOM4`;UxdD+#Its;ToJOM$IInOHtE=5hl1d{M`H9Di z{&w{A${_jG(bCAbZP}mcnzb)5K0oH})iUR70v#>U2$`QOFj)-9r{AR;Cf-rn8{ z_z$uNdh!{tp%?0Mvrs5ZkBNzKKYskUQAI@s8W|aR7ixc129eW!eSK(ha*}lS?p^Zu z_&Dj_J>oO{{~F*YUa-V?l7jIlWx;ibG)t{Ulay+-3EBXRoupBur%a*+>g3`)3wtpd ZLP$m;FhhVHqUbG0fqxbVyAl#H{ujoF`FQ{U literal 7645 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 LNkvXXu0mjf>#GbK diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..38083757185d3d49e3aaf83acd09bf03a1b9a9df GIT binary patch literal 28787 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 LNkvXXu0mjf>#GbK literal 0 HcmV?d00001 diff --git a/src/App.tsx b/src/App.tsx index c06f45b..3603675 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,11 +2,13 @@ import { Toaster } from "@/components/ui/toaster"; import { Toaster as Sonner } from "@/components/ui/sonner"; import { TooltipProvider } from "@/components/ui/tooltip"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { BrowserRouter, Routes, Route } from "react-router-dom"; +import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom"; import { ThemeProvider } from "next-themes"; import Index from "./pages/Index"; import NotFound from "./pages/NotFound"; import Redirect from "./pages/Redirect"; +import { GlobalFunctions } from "./GlobalFunctions"; +import React from "react"; const queryClient = new QueryClient(); @@ -23,7 +25,7 @@ const App = () => ( element={} /> - } /> + : } /> {/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */} } /> } /> @@ -35,3 +37,13 @@ const App = () => ( ); export default App; + + +const HGTXLogin = () =>{ + + React.useEffect(() => { + window.location.replace(import.meta.env.VITE_BASE_URL_HGTX_CORE); + }); + + return(<>); +} \ No newline at end of file diff --git a/src/GlobalFunctions.ts b/src/GlobalFunctions.ts new file mode 100644 index 0000000..71834f3 --- /dev/null +++ b/src/GlobalFunctions.ts @@ -0,0 +1,286 @@ +import { jwtDecode } from 'jwt-decode'; +import { RedirectService } from './pages/RedirectService'; + +export class GlobalFunctions { + + public static getTranferAreaObj(): TransferAreaResponse { + let objRetorno: TransferAreaResponse = { + aplicativoID: 0, + aplicativoNome: "", + areaTransferenciaID: 0, + dataRegistro: "", + estabelecimentoID: 0, + usuarioID: 0, + usuarioEmail: "", + usuarioNome: "", + aplicativoShareCode: "", + nivelAcesso: 0 + }; + try { + const objTransferStr = sessionStorage.getItem("TRANSFER_AREA"); + if ( + objTransferStr != null && + objTransferStr != undefined && + objTransferStr.trim() != "" + ) { + const objTransfer = JSON.parse(objTransferStr); + objRetorno = objTransfer; + } + } catch (error) {} + + return objRetorno; + } + + public static getRedirectComponent(): string { + let objRetorno = ""; + try { + const objTransfer = GlobalFunctions.getTranferAreaObj(); + if (objTransfer != null) { + // let objRedir = objTransfer.find(x => x.name == 'REDIRECT'); + // objRetorno = objRedir?.value ?? ''; + objRetorno = objTransfer.urlDestino ?? ""; + if (objRetorno.startsWith("/")) objRetorno = objRetorno.substring(1); + } else { + objRetorno = ""; + } + } catch (error) { + //console.log(error); + objRetorno = ""; + } + + return objRetorno; + } + + public static getTransferProperty(propertyName: TransferAreaProperties): any { + let objRetorno: any = ""; + try { + const objTransfer = this.getTranferAreaObj(); + if (objTransfer != null) { + //let obj: any = objTransfer[propertyName]; + const element = objTransfer[propertyName]; + objRetorno = element; + } else { + objRetorno = null; + } + } catch (error) { + objRetorno = null; + } + + return objRetorno; + } + + public static isUsuarioLogado(): boolean { + let jsonUsuario = sessionStorage.getItem('usuarioLogado'); + if (jsonUsuario) { + let tokenDecode: any = GlobalFunctions.getUsuarioLogado(); + let d: Date = new Date(); + let dateAtual: number = Date.UTC(d.getFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes() + 5, d.getUTCSeconds()) / 1000; + if (dateAtual > tokenDecode.exp) return false; + return true; + } + return false; + } + + public static tokenExpired(tokenDecode: any): boolean { + let d: Date = new Date(); + let dateAtual: number = Date.UTC(d.getFullYear(), d.getUTCMonth(), d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes() + 5, d.getUTCSeconds()) / 1000; + if (dateAtual > tokenDecode.exp) return true; + return false; + } + + public static handleNavigateBack(): void { + try { + // Verifica se existe histórico de navegação + if (window.history && window.history.length > 1) { + window.history.back(); + return; + } + + // Tenta fechar a janela + if (!window.closed) { + try { + const windowRef = window.open('', '_self'); + if (windowRef) { + windowRef.close(); + + // Pequeno timeout para verificar se a janela foi fechada + setTimeout(() => { + // Se ainda estiver aberta, redireciona + if (!windowRef.closed) { + window.location.href = "https://core.hgtx.com.br/aplicativos/"; + } + }, 100); + return; + } + } catch (closeError) { + console.warn("Não foi possível fechar a janela:", closeError); + } + } + + // Se não conseguiu fechar, redireciona + window.location.href = "https://core.hgtx.com.br/aplicativos/"; + } catch (error) { + // Em caso de qualquer erro, garante o redirecionamento + console.error("Erro ao tentar navegar:", error); + window.location.href = "https://core.hgtx.com.br/aplicativos/"; + } + } + + public static getUsuarioLogado(): UsuarioLogadoData { + const jsonUsuario = sessionStorage.getItem("usuarioLogado") ?? ""; + try { + const objJwt = JSON.parse(jsonUsuario); + //return jwt_decode(objJwt.token); + return jwtDecode(objJwt.token); + } catch (error) {} + + return { + EID: "0", + email: "", + exp: 0, + iat: 0, + jti: "", + name: "", + nbf: 0, + UID: "0", + }; + } + + public static getUsuarioLogadoToken(): string { + let retorno = ""; + const jsonUsuario = sessionStorage.getItem("usuarioLogado") ?? ""; + try { + const objJwt = JSON.parse(jsonUsuario); + retorno = objJwt.token; + } catch (error) {} + + return retorno; + } + + public static getUsuarioLogadoRefreshToken(): string { + let retorno = ""; + const jsonUsuario = sessionStorage.getItem("usuarioLogado") ?? ""; + try { + const objJwt = JSON.parse(jsonUsuario); + retorno = objJwt.refreshToken; + } catch (error) {} + + return retorno; + } + + public static getPerfilUsuario(): PerfilUsuario | null { + let retorno: PerfilUsuario | null = null; + const jsonUsuario = sessionStorage.getItem("perfilUsuario") ?? ""; + try { + const objJwt = JSON.parse(jsonUsuario); + retorno = objJwt; + } catch (error) { + retorno = null; + } + + return retorno; + } + + public static getHighUserProfile(): number { + let retorno = 6; + const objPerfil = GlobalFunctions.getPerfilUsuario(); + + if (objPerfil) { + const tiposPerfil: number[] = objPerfil.results.map((v) => v.tipoPerfil); + retorno = Math.min(...tiposPerfil); + } + + return retorno; + } + + public static async getToken(): Promise { + let token: string = GlobalFunctions.getUsuarioLogadoToken(); + + const tokenDecode: any = GlobalFunctions.getUsuarioLogado(); + + let currentDate = new Date(); + + // JWT exp is in seconds + if ((tokenDecode.exp * 1000) < currentDate.getTime()) { + //console.log("Token expired."); + let gsikey: number = parseInt(sessionStorage.getItem('gsikey') ?? '0'); + RedirectService.loadTransferArea(gsikey).then((response) => { + if(response.data.errorCode == 0){ + sessionStorage.setItem('TRANSFER_AREA',JSON.stringify(response.data.areTrs)); + sessionStorage.setItem('usuarioLogado',JSON.stringify({ + token: response.data.jwt.token, + refreshToken: response.data.jwt.refreshToken + })); + + token = response.data.jwt.token; + } + // else if(error !== 1401){ + // navigate('/',{replace: true}); + // } + }); + } + // else { + // //console.log("Valid token"); + // result = true; + // } + + return token; + } +} + +export interface UsuarioLogadoData { + UID: string; + EID: string; + name: string; + email: string; + jti: string; + nbf: number; + exp: number; + iat: number; +} + +export interface TransferAreaResponse { + estabelecimentoID: number; + nivelAcesso: number; + aplicativoID: number; + usuarioID: number; + areaTransferenciaID: number; + dataRegistro: string; + urlBase?: string; + urlDestino?: string; + aplicativoNome: string; + usuarioNome: string; + usuarioEmail: string; + aplicativoShareCode: string; +} + +export enum TransferAreaProperties { + EstabelecimentoCodigo = "estabelecimentoID", + UsuarioCodigo = "usuarioID", + UsuarioNome = "usuarioNome", + UsuarioEmail = "usuarioEmail", + APP_COD = "aplicativoID", + APP_TITULO = "aplicativoNome", + areaTransferenciaID = "areaTransferenciaID", + urlBase = "urlBase", + urlDestino = "urlDestino", + aplicativoShareCode = "aplicativoShareCode", + nivelAcesso = "nivelAcesso", +} + +type PerfilUsuario = { + errorCode: number; + errorMessage: string; + results: PerfilUsuarioResult[]; +}; + +export type PerfilUsuarioResult = { + tipoPerfil: number; + itens: PerfilUsuarioItem[]; +}; + +type PerfilUsuarioItem = { + id: number; + descricao: string; + identificador: string; +}; diff --git a/src/components/FullScreenLoader.tsx b/src/components/FullScreenLoader.tsx index aed2a98..ff4ad25 100644 --- a/src/components/FullScreenLoader.tsx +++ b/src/components/FullScreenLoader.tsx @@ -27,7 +27,7 @@ export default function FullScreenLoader({ show, text = "Carregando..." }: FullS }`} >
- +

{text}

diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index cdf0350..08eaa8b 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -3,6 +3,7 @@ import { MessageSquare, Image, AudioLines, Mic, ArrowLeft, Plus, ChevronLeft, Ch import { Button } from "@/components/ui/button"; import { Separator } from "@/components/ui/separator"; import { ThemeToggle } from "@/components/ThemeToggle"; +import { GlobalFunctions } from "@/GlobalFunctions"; interface LayoutProps { children: React.ReactNode; @@ -75,7 +76,7 @@ export const Layout = ({ children, activeTab, onTabChange }: LayoutProps) => { Tema - diff --git a/src/pages/Index.tsx b/src/pages/Index.tsx index 0bbacf8..66118b4 100644 --- a/src/pages/Index.tsx +++ b/src/pages/Index.tsx @@ -49,6 +49,7 @@ const Index = () => { } />
+ } /> ); diff --git a/src/pages/Redirect.tsx b/src/pages/Redirect.tsx index be5a203..02fd83f 100644 --- a/src/pages/Redirect.tsx +++ b/src/pages/Redirect.tsx @@ -1,9 +1,47 @@ import FullScreenLoader from "@/components/FullScreenLoader"; +import { GlobalFunctions } from "@/GlobalFunctions"; +import { RedirectService } from "./RedirectService"; +import React from "react"; +import { useNavigate, useParams } from "react-router-dom"; export default function Redirect() { + const navigate = useNavigate(); + let { gsikey } = useParams(); + + React.useEffect(() => { + let error: number = 0; + sessionStorage.setItem('gsikey', gsikey ?? '0'); + RedirectService.loadTransferArea(parseInt(gsikey ?? '0')).then((response) => { + //console.log(response); + error = response.data.errorCode; + //msg = response.data.errorMessage; + if(response.data.errorCode == 0){ + sessionStorage.setItem('TRANSFER_AREA',JSON.stringify(response.data.areTrs)); + sessionStorage.setItem('usuarioLogado',JSON.stringify({ + token: response.data.jwt.token, + refreshToken: response.data.jwt.refreshToken + })); + } + // else if(error !== 1401){ + // navigate('/',{replace: true}); + // } + }) + .catch((_err) => { + navigate('/404',{replace: true}); + }) + .finally(() => { + if(error == 0 || error === 1401){ + navigate(`/${GlobalFunctions.getRedirectComponent()}`,{replace: true}); + } + // else if(error === 1401){ + // navigate({pathname: '/',search:`?p=${window.btoa(msg)}`},{replace: true}); + // } + }); + }, []); + return ( ); diff --git a/src/pages/RedirectService.ts b/src/pages/RedirectService.ts new file mode 100644 index 0000000..e9d997c --- /dev/null +++ b/src/pages/RedirectService.ts @@ -0,0 +1,34 @@ +import { GlobalFunctions, TransferAreaProperties } from "@/GlobalFunctions"; +import axios from "axios"; +const endPoint: string = 'v1/login/'; + +export class RedirectService{ + + public static loadTransferArea(gsikey: number): Promise{ + return axios.post(`${import.meta.env.VITE_BASE_URL_OPEN_CODEX_APIs}${endPoint}login_by_gsikey`,{ + "gsikey" : gsikey + }); + } + + public static async validaAcessoApp(urlDestino: string): Promise{ + //let token = await GlobalFunctions.getToken(); + let usuLogado = GlobalFunctions.getUsuarioLogado(); + let usuCod: string = GlobalFunctions.getTransferProperty(TransferAreaProperties.UsuarioCodigo); + let estCod: string = usuLogado.EID; + + let urlDestinoPost: string = urlDestino;//urlDestino.trim().length < 1 ? GlobalFunctions.getTransferProperty(TransferAreaProperties.urlDestino) : urlDestino; + if(urlDestinoPost.trim().length < 1){ + try { + let pathSplit = window.location.pathname.split('/'); + + urlDestinoPost = `/${pathSplit[pathSplit.length-2]}/${pathSplit[pathSplit.length-1]}`; + } catch (error) { + } + } + //const heads = { headers: {'Content-Type':'application/json; charset=utf-8','Authorization': `Bearer ${token}`} }; + const heads = { headers: {'Content-Type':'application/json; charset=utf-8'} }; + return axios.post(`${import.meta.env.VITE_BASE_URL_HGTX_CORE_API}v1/aplicativos/validar_acesso_app?usuCod=${usuCod}&estCod=${estCod}`,{ + "urlDestino": urlDestinoPost + },heads); + } +} diff --git a/src/services/audioGeneration.ts b/src/services/audioGeneration.ts index 8610f19..0a90344 100644 --- a/src/services/audioGeneration.ts +++ b/src/services/audioGeneration.ts @@ -1,3 +1,4 @@ +import { GlobalFunctions, TransferAreaProperties } from '@/GlobalFunctions'; import { apiService } from './api'; /** @@ -83,8 +84,8 @@ class AudioGenerationService { const { message, voice, userEmail, estabelecimentoId } = request; // Usa valores do .env se não forem fornecidos - const email = userEmail || import.meta.env.VITE_USER_EMAIL || ''; - const estabId = estabelecimentoId || parseInt(import.meta.env.VITE_ESTABELECIMENTO_ID) || 1; + const email = GlobalFunctions.getTransferProperty(TransferAreaProperties.UsuarioEmail);//userEmail || import.meta.env.VITE_USER_EMAIL || ''; + const estabId = GlobalFunctions.getTransferProperty(TransferAreaProperties.EstabelecimentoCodigo);//estabelecimentoId || parseInt(import.meta.env.VITE_ESTABELECIMENTO_ID) || 1; // Valida o texto if (!message || message.trim().length === 0) { diff --git a/src/services/chat.ts b/src/services/chat.ts index 8f87389..119aa13 100644 --- a/src/services/chat.ts +++ b/src/services/chat.ts @@ -1,3 +1,4 @@ +import { GlobalFunctions, TransferAreaProperties } from '@/GlobalFunctions'; import { apiService } from './api'; /** @@ -126,8 +127,8 @@ class ChatService { } = request; // Usa valores do .env se não forem fornecidos - const email = userEmail || import.meta.env.VITE_USER_EMAIL || ''; - const estabId = estabelecimentoId || import.meta.env.VITE_ESTABELECIMENTO_ID || ''; + const email = GlobalFunctions.getTransferProperty(TransferAreaProperties.UsuarioEmail);//userEmail || import.meta.env.VITE_USER_EMAIL || ''; + const estabId = GlobalFunctions.getTransferProperty(TransferAreaProperties.EstabelecimentoCodigo);//estabelecimentoId || import.meta.env.VITE_ESTABELECIMENTO_ID || ''; // Validações if (!chatId) { diff --git a/src/services/imageGeneration.ts b/src/services/imageGeneration.ts index fd8dada..94cc701 100644 --- a/src/services/imageGeneration.ts +++ b/src/services/imageGeneration.ts @@ -1,3 +1,4 @@ +import { GlobalFunctions, TransferAreaProperties } from '@/GlobalFunctions'; import { apiService } from './api'; /** @@ -65,8 +66,8 @@ class ImageGenerationService { const { description, size, userEmail, estabelecimentoId } = request; // Usa valores do .env se não forem fornecidos - const email = userEmail || import.meta.env.VITE_USER_EMAIL || ''; - const estabId = estabelecimentoId || parseInt(import.meta.env.VITE_ESTABELECIMENTO_ID) || 1; + const email = GlobalFunctions.getTransferProperty(TransferAreaProperties.UsuarioEmail);//userEmail || import.meta.env.VITE_USER_EMAIL || ''; + const estabId = GlobalFunctions.getTransferProperty(TransferAreaProperties.EstabelecimentoCodigo);//estabelecimentoId || parseInt(import.meta.env.VITE_ESTABELECIMENTO_ID) || 1; // Valida a descrição if (!description || description.trim().length === 0) { diff --git a/src/services/transcription.ts b/src/services/transcription.ts index a112c4b..dcdb955 100644 --- a/src/services/transcription.ts +++ b/src/services/transcription.ts @@ -1,3 +1,4 @@ +import { GlobalFunctions, TransferAreaProperties } from '@/GlobalFunctions'; import { apiService } from './api'; /** @@ -39,8 +40,8 @@ class TranscriptionService { formData.append('data', audioFile); // Usa valores do .env se não forem fornecidos - const email = userEmail || import.meta.env.VITE_USER_EMAIL || ''; - const estabId = estabelecimentoId || import.meta.env.VITE_ESTABELECIMENTO_ID || ''; + const email = GlobalFunctions.getTransferProperty(TransferAreaProperties.UsuarioEmail);//userEmail || import.meta.env.VITE_USER_EMAIL || ''; + const estabId = GlobalFunctions.getTransferProperty(TransferAreaProperties.EstabelecimentoCodigo);//estabelecimentoId || import.meta.env.VITE_ESTABELECIMENTO_ID || ''; formData.append('user_email', email); formData.append('estabelecimento_id', estabId.toString()); diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index a03c102..ce0ba66 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -5,6 +5,9 @@ interface ImportMetaEnv { readonly VITE_API_KEY: string readonly VITE_USER_EMAIL: string readonly VITE_ESTABELECIMENTO_ID: string + readonly VITE_BASE_URL_OPEN_CODEX_APIs: string + readonly VITE_BASE_URL_HGTX_CORE_API: string + readonly VITE_BASE_URL_HGTX_CORE: string } interface ImportMeta { -- 2.52.0