@oondemand/oon-core-front 0.7.9 → 0.7.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-3EZ6GRFQ.js → chunk-4KTNTXOR.js} +4 -4
- package/dist/chunk-4KTNTXOR.js.map +1 -0
- package/dist/{chunk-JXU6W3ZU.js → chunk-EIFIGMY7.js} +2 -2
- package/dist/{chunk-5P3N4KJX.js → chunk-QW4OXKR7.js} +3 -3
- package/dist/{chunk-3JBDEAKP.js → chunk-Z4NC63HJ.js} +32 -13
- package/dist/chunk-Z4NC63HJ.js.map +1 -0
- package/dist/hooks.js +1 -1
- package/dist/index.js +4 -4
- package/dist/testing.js +3 -3
- package/dist/ui.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-3EZ6GRFQ.js.map +0 -1
- package/dist/chunk-3JBDEAKP.js.map +0 -1
- /package/dist/{chunk-JXU6W3ZU.js.map → chunk-EIFIGMY7.js.map} +0 -0
- /package/dist/{chunk-5P3N4KJX.js.map → chunk-QW4OXKR7.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/security/tenantStorage.ts","../src/start.tsx","../src/app/OonApp.tsx","../src/security/AcceptInviteCentralPage.tsx","../src/security/AcceptInvitePage.tsx","../src/security/OnboardingPage.tsx","../src/app/OonProviders.tsx","../src/config/queryClient.ts","../src/shell/LocalRuntimeBanner.tsx","../src/app/moduleRegistry.tsx","../src/app/createOonRouter.tsx","../src/shell/DefaultShell.tsx","../src/shell/Sidebar.tsx","../package.json","../src/runtime/versionInfo.ts","../src/shell/AuthenticatedLayout.tsx","../src/security/AccessDeniedPage.tsx","../src/security/AppAccessGuard.tsx","../src/security/LoginPage.tsx","../src/security/FirstAccessPage.tsx","../src/security/ActivationPage.tsx","../src/security/RouteGuard.tsx","../src/security/ActivationGuard.tsx","../src/components/internal/pipelineBoardLayout.ts","../src/app/codeFirst.ts"],"sourcesContent":["export interface TenantStorage {\n get(): string | null;\n set(tenantId: string): void;\n clear(): void;\n}\n\nexport interface TenantStorageOptions {\n enabled?: boolean;\n}\n\nfunction normalize(value: unknown): string | null {\n const normalized = String(value ?? \"\").trim();\n return normalized || null;\n}\n\nfunction tenantFromUrl(key: string): string | null {\n if (typeof window === \"undefined\") return null;\n const url = new URL(window.location.href);\n const tenantId = normalize(url.searchParams.get(\"tenant\"));\n if (!tenantId) return null;\n window.sessionStorage.setItem(key, tenantId);\n url.searchParams.delete(\"tenant\");\n window.history.replaceState(window.history.state, \"\", `${url.pathname}${url.search}${url.hash}`);\n return tenantId;\n}\n\n/**\n * Mantém o tenant no escopo da aba. Isso permite abrir Tenant A e Tenant B em\n * janelas diferentes sem uma aba trocar o contexto da outra. O query param\n * `tenant` transporta somente o identificador selecionado; o backend continua\n * validando o membership em todas as requisições.\n */\nexport function createTenantStorage(appId: string, options: TenantStorageOptions = {}): TenantStorage {\n const key = `oon:${appId}:tenant`;\n const enabled = options.enabled !== false;\n const clearStoredTenant = () => {\n if (typeof window === \"undefined\") return;\n window.sessionStorage.removeItem(key);\n window.localStorage.removeItem(key);\n };\n\n if (!enabled) {\n return {\n get() {\n clearStoredTenant();\n return null;\n },\n set() {\n clearStoredTenant();\n },\n clear: clearStoredTenant,\n };\n }\n\n return {\n get() {\n if (typeof window === \"undefined\") return null;\n const incoming = tenantFromUrl(key);\n if (incoming) return incoming;\n // Remove a seleção antiga global criada por versões anteriores do Core.\n window.localStorage.removeItem(key);\n return normalize(window.sessionStorage.getItem(key));\n },\n set(tenantId) {\n if (typeof window === \"undefined\") return;\n const value = normalize(tenantId);\n if (!value) {\n window.sessionStorage.removeItem(key);\n return;\n }\n window.sessionStorage.setItem(key, value);\n },\n clear() {\n if (typeof window !== \"undefined\") window.sessionStorage.removeItem(key);\n },\n };\n}\n\n","import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { OonCoreFrontConfig } from \"./types\";\nimport { OonApp } from \"./app/OonApp\";\nimport { installPipelineBoardLayoutStyles } from \"./components/internal/pipelineBoardLayout\";\n\nfunction validateConfig(config: OonCoreFrontConfig) {\n if (!config?.app?.id) throw new Error(\"oonCoreFront.start: config.app.id é obrigatório.\");\n if (!config?.api?.baseUrl) throw new Error(\"oonCoreFront.start: config.api.baseUrl é obrigatório.\");\n}\n\nfunction applyDocumentMeta(config: OonCoreFrontConfig) {\n if (config.app.title) document.title = config.app.title;\n if (config.app.favicon) {\n let link = document.querySelector<HTMLLinkElement>('link[rel=\"icon\"]');\n if (!link) {\n link = document.createElement(\"link\");\n link.rel = \"icon\";\n document.head.appendChild(link);\n }\n link.href = config.app.favicon;\n }\n}\n\nfunction hardenConsole(config: OonCoreFrontConfig) {\n if (config.security?.disableConsoleInProduction && import.meta.env?.PROD) {\n const noop = () => {};\n console.log = noop;\n console.debug = noop;\n console.info = noop;\n }\n}\n\n/**\n * Montagem interna usada por `startOonApp`. Apps consumidores usam somente a\n * API code-first pública e não precisam conhecer providers ou infraestrutura.\n */\nexport function start(config: OonCoreFrontConfig) {\n validateConfig(config);\n applyDocumentMeta(config);\n installPipelineBoardLayoutStyles();\n hardenConsole(config);\n\n const rootId = config.rootElementId ?? \"root\";\n const el = document.getElementById(rootId);\n if (!el) throw new Error(`oonCoreFront.start: elemento #${rootId} não encontrado no DOM.`);\n\n createRoot(el).render(\n <StrictMode>\n <OonApp config={config} />\n </StrictMode>\n );\n}\n\n","import { useMemo } from \"react\";\nimport { RouterProvider } from \"react-router-dom\";\nimport type { OonCoreFrontConfig, OonRoute } from \"../types\";\nimport { createRestClient } from \"../api/createRestClient\";\nimport { createTokenStorage } from \"../security/tokenStorage\";\nimport { createTenantStorage } from \"../security/tenantStorage\";\nimport { AcceptInviteCentralPage } from \"../security/AcceptInviteCentralPage\";\nimport { OnboardingPage } from \"../security/OnboardingPage\";\nimport { OonProviders } from \"./OonProviders\";\nimport { resolveRegistry } from \"./moduleRegistry\";\nimport { createOonRouter } from \"./createOonRouter\";\n\nfunction localLoginUrl(): string {\n const current = `${window.location.pathname}${window.location.search}`;\n return `/login?redirect=${encodeURIComponent(current)}`;\n}\n\n/**\n * Raiz da aplicação Core. Cria o cliente REST, resolve rotas/menu e monta os\n * providers. Respostas 401 seguem para o login; 403 é tratado pelo AuthProvider.\n */\nexport function OonApp({ config }: { config: OonCoreFrontConfig }) {\n const { http, storage, tenantStorage, router } = useMemo(() => {\n const storage = createTokenStorage(config.app.id);\n const tenantStorage = createTenantStorage(config.app.id, {\n enabled: config.app.tenancyModel !== \"none\",\n });\n const externalLoginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;\n\n const http = createRestClient({\n api: config.api,\n appId: config.app.id,\n runtimeMode: config.runtimeMode,\n getToken: () => storage.get(),\n getTenantId: () => tenantStorage.get(),\n onUnauthorized: () => {\n storage.clear();\n\n if (config.runtimeMode === \"local\" || window.location.pathname === \"/accept-invite\") return;\n\n if (externalLoginUrl) {\n window.location.href = externalLoginUrl;\n return;\n }\n\n if (window.location.pathname !== \"/login\") {\n window.location.href = localLoginUrl();\n }\n },\n });\n\n const resolved = resolveRegistry(config);\n const routes: OonRoute[] = [...resolved.routes];\n const corePublicRoutes: OonRoute[] = [{\n path: \"/accept-invite\",\n public: true,\n element: <AcceptInviteCentralPage />,\n }];\n\n if (config.api.onboardingBaseUrl) {\n corePublicRoutes.push({ path: \"/cadastro\", public: true, element: <OnboardingPage baseUrl={config.api.onboardingBaseUrl} mode=\"register\" /> });\n corePublicRoutes.push({ path: \"/confirmar-email\", public: true, element: <OnboardingPage baseUrl={config.api.onboardingBaseUrl} mode=\"confirm\" /> });\n }\n\n const router = createOonRouter({\n app: config.app,\n menu: resolved.menu,\n routes,\n corePublicRoutes,\n onboardingEnabled: Boolean(config.api.onboardingBaseUrl),\n security: config.security,\n layout: config.layout ?? config.ui?.layout,\n registry: config.registry ?? config.ui?.registry,\n systemPages: config.systemPages,\n });\n\n return { http, storage, tenantStorage, router };\n }, [config]);\n\n return (\n <OonProviders\n config={config}\n http={http}\n storage={storage}\n tenantStorage={tenantStorage}\n >\n <RouterProvider router={router} />\n </OonProviders>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { Box, Text } from \"@chakra-ui/react\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { AcceptInvitePage } from \"./AcceptInvitePage\";\n\ninterface PublicRbacInfo {\n central?: { appCode: string; name: string };\n}\n\nexport function AcceptInviteCentralPage() {\n const { http } = useOonApi();\n const [centralName, setCentralName] = useState(\"Central Oon\");\n\n useEffect(() => {\n let active = true;\n http.get<PublicRbacInfo>(\"/core/rbac\")\n .then((response) => {\n if (active && response.data.central?.name) setCentralName(response.data.central.name);\n })\n .catch(() => undefined);\n return () => { active = false; };\n }, [http]);\n\n return (\n <Box bg=\"#F5F8FA\" minH=\"100vh\" pt={4}>\n <Box mx=\"auto\" maxW=\"480px\" px={4} textAlign=\"center\">\n <Text fontSize=\"sm\" fontWeight=\"700\">Convite para: {centralName}</Text>\n </Box>\n <AcceptInvitePage />\n </Box>\n );\n}\n","import { useEffect, useState, useRef, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Text, VStack } from \"@chakra-ui/react\";\nimport { useLocation } from \"react-router-dom\";\nimport { useOonAuth } from \"./AuthProvider\";\nimport { useOonApi } from \"../api/ApiProvider\";\n\ninterface InvitationInfo {\n accountExists: boolean;\n allowedActions?: string[];\n blockedReason?: string | null;\n version?: number;\n registrationRequired?: boolean;\n sessionUser?: { email: string } | null;\n email: string;\n name?: string;\n roleCode: string;\n roleName?: string;\n expiresAt: string;\n}\n\nexport function AcceptInvitePage() {\n const { http } = useOonApi();\n const location = useLocation();\n const auth = useOonAuth();\n const token = new URLSearchParams(location.hash.slice(1)).get(\"token\") || new URLSearchParams(location.search).get(\"token\") || \"\";\n const [invitation, setInvitation] = useState<InvitationInfo | null>(null);\n const [sessionEmail, setSessionEmail] = useState(\"\");\n const operationKey = useRef(crypto.randomUUID());\n const [registration, setRegistration] = useState({ nome: \"\", userDocument: \"\", phone: \"\", termsAccepted: false });\n const [password, setPassword] = useState(\"\");\n const [confirm, setConfirm] = useState(\"\");\n const [message, setMessage] = useState<string | null>(null);\n const [inspectionAttempt, setInspectionAttempt] = useState(0);\n const [submitting, setSubmitting] = useState(false);\n const [done, setDone] = useState(false);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let active = true;\n operationKey.current = crypto.randomUUID();\n setLoading(true); setInvitation(null); setDone(false); setMessage(null); setPassword(\"\"); setConfirm(\"\");\n if (!token) {\n setMessage(\"Link de convite inválido.\");\n setLoading(false);\n return;\n }\n http.post<{ invitation: InvitationInfo }>(\"/core/invitations/inspect\", { token }, { headers: { \"x-oon-tenant-id\": false } })\n .then((response) => { if (active) {\n setInvitation(response.data.invitation);\n setSessionEmail(String(response.data.invitation.sessionUser?.email || \"\").trim().toLowerCase());\n } })\n .catch((error) => { if (active) setMessage(error?.status === 410\n ? \"Este convite é inválido, expirou, foi revogado ou já foi utilizado. Convites anteriores ao corte também podem ter sido invalidados. Solicite um novo convite ao administrador.\"\n : \"Não foi possível validar o convite. Tente novamente.\"); })\n .finally(() => { if (active) setLoading(false); });\n return () => { active = false; };\n }, [http, token, inspectionAttempt]);\n\n function clearSession() { auth.clearSession(); setSessionEmail(\"\"); }\n const sameSession = Boolean(sessionEmail && sessionEmail === invitation?.email.toLowerCase());\n const otherSession = Boolean(sessionEmail && !sameSession);\n const register = invitation?.accountExists === false;\n\n async function submit(event: FormEvent) {\n event.preventDefault();\n if (submitting || otherSession || auth.status === \"loading\") return;\n setMessage(null);\n if (!sameSession && register && password.length < 8) {\n setMessage(\"A senha deve possuir pelo menos 8 caracteres.\");\n return;\n }\n if (!sameSession && register && password !== confirm) {\n setMessage(\"As senhas informadas não conferem.\");\n return;\n }\n setSubmitting(true);\n try {\n await http.post(\"/core/invitations/accept\", {\n token, ...(invitation?.version !== undefined ? { version: invitation.version } : {}),\n ...(register && invitation?.registrationRequired ? { registration: { ...registration, termsVersion: \"2026-08-18\", privacyVersion: \"2026-08-18\" } } : {}),\n intent: sameSession ? \"session\" : register ? \"register\" : \"authenticate\",\n ...(sameSession ? {} : { password }),\n }, { headers: { \"idempotency-key\": operationKey.current, ...(sameSession ? {} : { Authorization: false }), \"x-oon-tenant-id\": false } });\n setDone(true);\n setMessage(\"Convite aceito. Seu acesso está disponível.\");\n } catch (error: any) {\n if (sameSession && error?.status === 401) clearSession();\n setMessage(error?.message || \"Não foi possível concluir o convite.\");\n } finally { setSubmitting(false); }\n }\n\n return (\n <Flex minH=\"100vh\" align=\"center\" justify=\"center\" bg=\"#F5F8FA\" px={4}>\n <Box width=\"100%\" maxW=\"480px\" bg=\"white\" borderWidth=\"1px\" borderRadius=\"18px\" p={{ base: 6, md: 9 }}>\n <VStack align=\"stretch\" gap={5}>\n <Box>\n <Text color=\"#39BFED\" fontSize=\"xs\" fontWeight=\"700\" textTransform=\"uppercase\">Central Oon</Text>\n <Heading mt={2} size=\"lg\">Aceitar convite</Heading>\n </Box>\n\n {loading ? <Text>Validando convite…</Text> : null}\n {invitation && !done ? (\n <>\n <Box bg=\"gray.50\" borderRadius=\"md\" p={4}>\n <Text fontWeight=\"700\">{invitation.name || invitation.email}</Text>\n <Text fontSize=\"sm\">{invitation.email}</Text>\n <Text fontSize=\"sm\" color=\"gray.600\">Perfil: {invitation.roleName || invitation.roleCode}</Text>\n </Box>\n {otherSession ? <Box>\n <Text>Você está conectado como {sessionEmail}. Este convite é para {invitation.email}.</Text>\n <Button onClick={clearSession}>Trocar de conta</Button>\n </Box> : <form onSubmit={(event) => void submit(event)}>\n <VStack align=\"stretch\" gap={4}>\n {register && invitation.registrationRequired ? <Box>\n <Text>Complete seu cadastro para aceitar este convite. Não será criada outra organização.</Text>\n <Input aria-label=\"Nome completo\" placeholder=\"Nome completo\" required value={registration.nome} onChange={e => setRegistration({ ...registration, nome: e.target.value })} />\n <Input aria-label=\"CPF\" placeholder=\"CPF\" required value={registration.userDocument} onChange={e => setRegistration({ ...registration, userDocument: e.target.value })} />\n <Input aria-label=\"Telefone\" placeholder=\"Telefone com DDD\" required value={registration.phone} onChange={e => setRegistration({ ...registration, phone: e.target.value })} />\n <label><input type=\"checkbox\" required checked={registration.termsAccepted} onChange={e => setRegistration({ ...registration, termsAccepted: e.target.checked })} /> Aceito os termos e a política de privacidade da plataforma (2026-08-18).</label>\n </Box> : null}\n {!sameSession ? <Box>\n <Text mb={1} fontSize=\"sm\" fontWeight=\"600\">{register ? \"Nova senha\" : \"Senha atual\"}</Text>\n <Input aria-label={register ? \"Nova senha\" : \"Senha atual\"} type=\"password\" autoComplete={register ? \"new-password\" : \"current-password\"} value={password} onChange={(event) => setPassword(event.target.value)} required />\n </Box> : <Text>Você está conectado como {sessionEmail}. Confirme o aceite para liberar este acesso.</Text>}\n {!sameSession && register ? <Box>\n <Text mb={1} fontSize=\"sm\" fontWeight=\"600\">Confirmar senha</Text>\n <Input aria-label=\"Confirmar senha\" type=\"password\" autoComplete=\"new-password\" value={confirm} onChange={(event) => setConfirm(event.target.value)} required />\n </Box> : null}\n {!register && !sameSession ? <Text fontSize=\"sm\">Use a senha atual da sua conta Oon. Se esqueceu a senha, recupere-a pelo login da plataforma e depois reabra este convite.</Text> : null}\n {invitation.blockedReason ? <Text role=\"alert\">O aceite está indisponível ({invitation.blockedReason}). Solicite regularização ao administrador.</Text> : null}\n <Button type=\"submit\" disabled={submitting || auth.status === \"loading\" || Boolean(invitation.allowedActions && !invitation.allowedActions.includes(\"accept\"))}>{submitting ? \"Aceitando…\" : \"Aceitar convite\"}</Button>\n </VStack>\n </form>}\n </>\n ) : null}\n\n {message ? <Box role=\"status\" bg={done ? \"green.50\" : \"red.50\"} borderRadius=\"md\" p={3}><Text fontSize=\"sm\">{message}</Text></Box> : null}\n {!loading && !invitation && token ? <Button onClick={() => setInspectionAttempt(value => value + 1)}>Tentar novamente</Button> : null}\n {done ? <Button asChild><a href={sameSession ? \"/\" : \"/login\"}>{sameSession ? \"Abrir aplicativo\" : \"Ir para o login\"}</a></Button> : null}\n </VStack>\n </Box>\n </Flex>\n );\n}\n","import { useEffect, useRef, useState, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Text, VStack } from \"@chakra-ui/react\";\nimport { Link, useLocation } from \"react-router-dom\";\n\ntype Props = { baseUrl: string; mode: \"register\" | \"confirm\" };\nconst TERMS_VERSION = \"2026-08-18\";\nconst PRIVACY_VERSION = \"2026-08-18\";\n\nasync function post(baseUrl: string, path: string, body: unknown) {\n const response = await fetch(baseUrl.replace(/\\/$/, \"\") + \"/onboarding/\" + path, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"x-correlation-id\": crypto.randomUUID() },\n body: JSON.stringify(body),\n });\n const payload = await response.json().catch(() => ({}));\n if (!response.ok) throw new Error(payload.message || \"Não foi possível concluir a solicitação.\");\n return payload;\n}\n\nexport function OnboardingPage({ baseUrl, mode }: Props) {\n const location = useLocation();\n const [form, setForm] = useState({ nome: \"\", email: \"\", password: \"\", organizationName: \"\", organizationDocument: \"\" });\n const [accepted, setAccepted] = useState(false);\n const [message, setMessage] = useState(\"\");\n const [busy, setBusy] = useState(false);\n const confirmationToken = useRef<string | null>(null);\n\n useEffect(() => {\n if (mode !== \"confirm\") return;\n const token = new URLSearchParams(location.search).get(\"token\");\n if (!token) return setMessage(\"Link de confirmação inválido.\");\n if (confirmationToken.current === token) return;\n confirmationToken.current = token;\n setBusy(true);\n post(baseUrl, \"confirm-email\", { token })\n .then(() => setMessage(\"E-mail confirmado. Seu acesso ao Meus Apps e Workspace está pronto.\"))\n .catch((error) => setMessage(error.message))\n .finally(() => setBusy(false));\n }, [baseUrl, location.search, mode]);\n\n async function submit(event: FormEvent) {\n event.preventDefault();\n setBusy(true);\n setMessage(\"\");\n try {\n const result = await post(baseUrl, \"register\", {\n ...form, termsAccepted: accepted, termsVersion: TERMS_VERSION, privacyVersion: PRIVACY_VERSION,\n });\n setMessage(result.message);\n } catch (error) {\n setMessage((error as Error).message);\n } finally {\n setBusy(false);\n }\n }\n\n return <Flex minH=\"100vh\" align=\"center\" justify=\"center\" bg=\"#F5F8FA\" px={4}>\n <Box width=\"100%\" maxW=\"520px\" bg=\"white\" borderWidth=\"1px\" borderRadius=\"18px\" p={{ base: 6, md: 9 }}>\n <VStack align=\"stretch\" gap={5}>\n <Box>\n <Text color=\"#39BFED\" fontSize=\"xs\" fontWeight=\"700\" textTransform=\"uppercase\">Plataforma Oon</Text>\n <Heading mt={2} size=\"lg\" color=\"#07262E\">{mode === \"register\" ? \"Crie seu acesso\" : \"Confirmação de e-mail\"}</Heading>\n <Text mt={2} color=\"gray.600\" fontSize=\"sm\">\n {mode === \"register\" ? \"Comece com Meus Apps e Workspace em modo de onboarding.\" : \"Validando seu link seguro de uso único.\"}\n </Text>\n </Box>\n {mode === \"register\" ? <form onSubmit={submit}>\n <VStack align=\"stretch\" gap={3}>\n <Input placeholder=\"Seu nome\" value={form.nome} onChange={(e) => setForm({ ...form, nome: e.target.value })} required />\n <Input type=\"email\" placeholder=\"voce@empresa.com.br\" value={form.email} onChange={(e) => setForm({ ...form, email: e.target.value })} required />\n <Input type=\"password\" minLength={8} placeholder=\"Senha com 8 ou mais caracteres\" value={form.password} onChange={(e) => setForm({ ...form, password: e.target.value })} required />\n <Input placeholder=\"Nome da organização\" value={form.organizationName} onChange={(e) => setForm({ ...form, organizationName: e.target.value })} required />\n <Input placeholder=\"CNPJ/Documento (opcional)\" value={form.organizationDocument} onChange={(e) => setForm({ ...form, organizationDocument: e.target.value })} />\n <label><input type=\"checkbox\" checked={accepted} onChange={(e) => setAccepted(e.target.checked)} /> <Text as=\"span\" fontSize=\"sm\">Aceito os termos e a política de privacidade vigentes.</Text></label>\n <Button type=\"submit\" bg=\"#07262E\" color=\"white\" disabled={busy || !accepted}>{busy ? \"Enviando...\" : \"Criar acesso\"}</Button>\n </VStack>\n </form> : null}\n {message ? <Box role=\"status\" bg=\"blue.50\" color=\"blue.800\" borderRadius=\"10px\" p={4}>{message}</Box> : null}\n <Text fontSize=\"sm\"><Link to=\"/login\">Voltar para o login</Link></Text>\n </VStack>\n </Box>\n </Flex>;\n}\n","import { type ReactNode, useMemo } from \"react\";\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport type { AxiosInstance } from \"axios\";\nimport type { OonCoreFrontConfig } from \"../types\";\nimport { createOonQueryClient } from \"../config/queryClient\";\nimport { OonThemeProvider } from \"../config/ThemeProvider\";\nimport { ApiProvider } from \"../api/ApiProvider\";\nimport { AuthProvider } from \"../security/AuthProvider\";\nimport { ActivationProvider } from \"../security/ActivationProvider\";\nimport { TenantProvider } from \"../security/TenantProvider\";\nimport type { TokenStorage } from \"../security/tokenStorage\";\nimport type { TenantStorage } from \"../security/tenantStorage\";\nimport { LocalRuntimeBanner } from \"../shell/LocalRuntimeBanner\";\n\nexport interface OonProvidersProps {\n config: OonCoreFrontConfig;\n http: AxiosInstance;\n storage: TokenStorage;\n tenantStorage: TenantStorage;\n children: ReactNode;\n}\n\n/**\n * Monta, em ordem, todos os providers globais. Nenhuma Central cliente deve\n * montar QueryClient/Chakra/Auth/Api/Tenant manualmente.\n *\n * Ordem: QueryClient -> Chakra -> Api -> Activation -> Tenant -> Auth.\n */\nexport function OonProviders({\n config,\n http,\n storage,\n tenantStorage,\n children,\n}: OonProvidersProps) {\n const queryClient = useMemo(() => createOonQueryClient(), []);\n const loginUrl = config.auth?.loginUrl ?? config.api.meusAppsUrl;\n const authenticatedContent = (\n <AuthProvider\n http={http}\n storage={storage}\n auth={config.auth}\n loginUrl={loginUrl}\n runtimeMode={config.runtimeMode}\n >\n {config.runtimeMode === \"local\"\n ? <LocalRuntimeBanner http={http}>{children}</LocalRuntimeBanner>\n : children}\n </AuthProvider>\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <OonThemeProvider config={config}>\n <ApiProvider http={http}>\n <ActivationProvider http={http}>\n {config.app.tenancyModel === \"none\"\n ? authenticatedContent\n : <TenantProvider http={http} storage={tenantStorage}>{authenticatedContent}</TenantProvider>}\n </ActivationProvider>\n </ApiProvider>\n </OonThemeProvider>\n </QueryClientProvider>\n );\n}\n","import { QueryClient } from \"@tanstack/react-query\";\n\nconst QUERY_STALE_TIME_MS = 5 * 1000;\nconst QUERY_REFETCH_INTERVAL_MS = 10 * 1000;\n\n/**\n * QueryClient padrão do Core.\n *\n * A Central é uma interface operacional: listas e datagrids precisam refletir\n * rapidamente alterações feitas por automações, webhooks e outros usuários.\n * Por isso, consultas ativas ficam obsoletas em poucos segundos e são\n * revalidadas periodicamente enquanto a aba estiver visível.\n */\nexport function createOonQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: {\n retry: 1,\n staleTime: QUERY_STALE_TIME_MS,\n refetchInterval: QUERY_REFETCH_INTERVAL_MS,\n refetchIntervalInBackground: false,\n refetchOnMount: \"always\",\n refetchOnReconnect: \"always\",\n refetchOnWindowFocus: \"always\",\n },\n mutations: {\n retry: 0,\n },\n },\n });\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport type { AxiosInstance } from \"axios\";\nimport { useOonAuth } from \"../security/AuthProvider\";\nimport { useActivation } from \"../security/ActivationProvider\";\n\ntype LocalRole = { code: string; name: string };\n\nexport function LocalRuntimeBanner({ http, children }: { http: AxiosInstance; children: ReactNode }) {\n const auth = useOonAuth();\n const activation = useActivation();\n const [roles, setRoles] = useState<LocalRole[]>([]);\n const roleCode = String((auth.user as { roleCode?: string } | null)?.roleCode || \"\");\n\n useEffect(() => {\n if (!auth.isAuthenticated) return;\n void http.get<{ roles: LocalRole[] }>(\"/auth/local/context\")\n .then((response) => setRoles(response.data.roles || []))\n .catch(() => setRoles([]));\n }, [auth.isAuthenticated, http]);\n\n async function switchRole(nextRole: string) {\n await http.post(\"/auth/local/role\", { roleCode: nextRole });\n await auth.retry();\n }\n\n const expiration = activation.details?.expiresAt\n ? new Intl.DateTimeFormat(\"pt-BR\", { dateStyle: \"short\", timeStyle: \"short\" })\n .format(new Date(activation.details.expiresAt))\n : null;\n\n return (\n <>\n <div\n role=\"status\"\n style={{\n alignItems: \"center\",\n background: \"#172554\",\n color: \"white\",\n display: \"flex\",\n flexWrap: \"wrap\",\n font: \"600 13px system-ui\",\n gap: 12,\n justifyContent: \"center\",\n padding: \"8px 16px\",\n }}\n >\n <span>Desenvolvimento local · desconectado do Ecossistema</span>\n {expiration ? <span>Expira em {expiration}</span> : null}\n {auth.isAuthenticated && roles.length > 1 ? (\n <label>\n Perfil local:{\" \"}\n <select\n aria-label=\"Perfil local\"\n value={roleCode}\n onChange={(event) => void switchRole(event.target.value)}\n style={{ color: \"#111827\" }}\n >\n {roles.map((role) => (\n <option key={role.code} value={role.code}>{role.name}</option>\n ))}\n </select>\n </label>\n ) : null}\n </div>\n {children}\n </>\n );\n}\n","import type { CollectionViewDef, DashboardViewDef, DocumentViewDef, OonCoreFrontConfig, OonMenuItem, OonRoute, OonViewDefinition, OonPageDef } from \"../types\";\nimport type { OonPipelineViewDef } from \"../pipelineTicket\";\nimport { CoreCollection } from \"../components/CoreCollection\";\nimport { CoreDocument } from \"../components/CoreDocument\";\nimport { CorePipeline } from \"../components/CorePipeline\";\nimport { CoreDashboard } from \"../components/CoreDashboard\";\nimport { CoreUsersAccess } from \"../components/CoreUsersAccess\";\nimport { CorePage } from \"../components/ui-v2/CorePage\";\nimport { CoreTransactionalEmail } from \"../components/CoreTransactionalEmail\";\n\nexport interface ResolvedRegistry { routes: OonRoute[]; menu: OonMenuItem[]; }\nfunction slug(value: string): string { return value.normalize(\"NFD\").replace(/[\\u0300-\\u036f]/g, \"\").toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\"); }\nfunction requiredPermissions(source: { permissions?: string[] }): string[] | undefined { const values = [...(source.permissions ?? [])].filter(Boolean); return values.length ? values : undefined; }\nfunction declaredAppCapabilities(config: OonCoreFrontConfig): string[] | undefined { const capabilities = (config.app as OonCoreFrontConfig[\"app\"] & { capabilities?: string[] }).capabilities; return Array.isArray(capabilities) ? capabilities : undefined; }\nfunction supportsCapabilities(config: OonCoreFrontConfig, source: { capabilities?: string[] }): boolean { const required = (source.capabilities ?? []).filter(Boolean); if (!required.length) return true; const declared = declaredAppCapabilities(config); if (!declared) return true; return required.every((capability) => declared.includes(capability)); }\nfunction viewId(view: OonViewDefinition): string { if (view.id) return view.id; if (view.type === \"dashboard\") return \"dashboard\"; return slug(view.model); }\nfunction viewPath(view: OonViewDefinition): string { if (view.path) return view.path; if (view.type === \"dashboard\") return \"/\"; return `/${viewId(view)}`; }\nfunction viewLabel(view: OonViewDefinition): string { if (view.label) return view.label; if (view.type === \"dashboard\") return \"Dashboard\"; return view.model; }\nfunction renderView(view: OonViewDefinition, registry?: OonCoreFrontConfig[\"registry\"]) {\n switch (view.type) {\n case \"collection\": { const v = view as CollectionViewDef; return <CoreCollection model={v.model} mode={v.mode} columns={v.columns} form={v.form} label={viewLabel(v)} section={v.section} importExport={v.importExport} list={v.list} relations={v.relations} detailModal={v.detailModal} cellRenderers={registry?.cellRenderers} registry={registry} />; }\n case \"document\": { const v = view as DocumentViewDef; return <CoreDocument model={v.model} label={viewLabel(v)} endpoint={v.endpoint} approval={v.approval} attachments={v.attachments} display={v.display} categoryField={v.categoryField} titleField={v.titleField} descriptionField={v.descriptionField} contentField={v.contentField} statusField={v.statusField} updatedAtField={v.updatedAtField} />; }\n case \"pipeline\": { const v = view as OonPipelineViewDef; return <CorePipeline model={v.model} label={viewLabel(v)} stageField={v.stageField} stages={v.stages} titleField={v.titleField} form={v.form} relations={v.relations} ticketModal={v.ticketModal} filters={v.filters} create={v.create} viewModes={v.viewModes} defaultView={v.defaultView} list={v.list} defaultActions={v.defaultActions} ticketActions={v.ticketActions} registry={registry} />; }\n case \"dashboard\": { const v = view as DashboardViewDef; return <CoreDashboard label={viewLabel(v)} widgets={v.widgets} />; }\n default: return null;\n }\n}\nfunction viewToRoute(view: OonViewDefinition, registry?: OonCoreFrontConfig[\"registry\"]): OonRoute { return { path: viewPath(view), element: renderView(view, registry), permissions: requiredPermissions(view), capabilities: \"capabilities\" in view ? view.capabilities : undefined }; }\nfunction pageToRoute(page: OonPageDef, registry: OonCoreFrontConfig[\"registry\"]): OonRoute { return { path: page.path, element: <CorePage page={page} registry={registry} />, public: page.public === true, permissions: requiredPermissions(page), capabilities: page.capabilities }; }\nfunction pageToMenu(page: OonPageDef): OonMenuItem | null { if (!page.label) return null; return { label: page.label, href: page.path, icon: page.icon, section: page.section, permissions: requiredPermissions(page), capabilities: page.capabilities, hidden: page.hidden, order: page.order }; }\nfunction viewToMenu(view: OonViewDefinition): OonMenuItem { const extended = view as OonViewDefinition & { hidden?: boolean; order?: number }; return { label: viewLabel(view), href: viewPath(view), icon: view.icon, section: view.section, permissions: requiredPermissions(view), capabilities: \"capabilities\" in view ? view.capabilities : undefined, hidden: extended.hidden, order: extended.order }; }\n\nexport function resolveRegistry(config: OonCoreFrontConfig): ResolvedRegistry {\n const routes: OonRoute[] = []; const menu: OonMenuItem[] = []; const seenPaths = new Set<string>(); const componentRegistry = config.registry ?? config.ui?.registry;\n const pushRoute = (route: OonRoute) => { if (!supportsCapabilities(config, route) || seenPaths.has(route.path)) return; seenPaths.add(route.path); routes.push({ ...route, permissions: requiredPermissions(route) }); };\n const pushMenu = (item: OonMenuItem) => { if (!supportsCapabilities(config, item)) return; menu.push({ ...item, permissions: requiredPermissions(item) }); };\n for (const mod of config.modules ?? []) { for (const route of mod.routes ?? []) pushRoute(route); for (const item of mod.menu ?? []) pushMenu(item); for (const view of mod.views ?? []) { pushRoute(viewToRoute(view, componentRegistry)); pushMenu(viewToMenu(view)); } }\n if ([\"root-central\", \"member-central\"].includes(String(config.app.kind || \"\"))) { pushRoute({ path: \"/usuarios-acessos\", element: <CoreUsersAccess />, permissions: [\"users.read\"] }); pushMenu({ label: \"Usuários e Acessos\", href: \"/usuarios-acessos\", section: \"Configurações\", order: 900, permissions: [\"users.read\"] }); }\n if (declaredAppCapabilities(config)?.includes(\"core.transactional-email\")) { pushRoute({ path: \"/configuracoes/email-transacional\", element: <CoreTransactionalEmail />, permissions: [\"transactional-email.config.read\"], capabilities: [\"core.transactional-email\"] }); pushMenu({ label: \"E-mail transacional\", href: \"/configuracoes/email-transacional\", section: \"Configurações\", order: 910, permissions: [\"transactional-email.config.read\"], capabilities: [\"core.transactional-email\"] }); }\n const navMode = config.ui?.navigation?.mode ?? \"auto\"; const includeAuto = navMode === \"auto\" || navMode === \"mixed\"; const includeManual = navMode === \"manual\" || navMode === \"mixed\";\n for (const view of config.ui?.views ?? []) { pushRoute(viewToRoute(view, componentRegistry)); if (includeAuto) pushMenu(viewToMenu(view)); }\n for (const page of config.ui?.pages ?? []) { pushRoute(pageToRoute(page, componentRegistry)); if (includeAuto) { const item = pageToMenu(page); if (item) pushMenu(item); } }\n if (includeManual) for (const item of config.ui?.navigation?.items ?? []) pushMenu(item);\n menu.sort((a, b) => (a.order ?? 100) - (b.order ?? 100)); return { routes, menu };\n}\n","import {\n Navigate,\n createBrowserRouter,\n type RouteObject,\n} from \"react-router-dom\";\nimport type {\n OonAppConfig,\n OonMenuItem,\n OonRoute,\n OonLayoutConfig,\n OonComponentRegistry,\n OonSecurityConfig,\n OonSystemPages,\n} from \"../types\";\nimport { AuthenticatedLayout } from \"../shell/AuthenticatedLayout\";\nimport { AccessDeniedPage } from \"../security/AccessDeniedPage\";\nimport { AppAccessGuard } from \"../security/AppAccessGuard\";\nimport { LoginPage } from \"../security/LoginPage\";\nimport { AcceptInvitePage } from \"../security/AcceptInvitePage\";\nimport { FirstAccessPage } from \"../security/FirstAccessPage\";\nimport {\n ActivationPage,\n InstanceBlockedPage,\n} from \"../security/ActivationPage\";\nimport { RouteGuard } from \"../security/RouteGuard\";\nimport { ActivationGuard } from \"../security/ActivationGuard\";\nimport { OON_RESERVED_ROUTES, routeElement } from \"../routing\";\n\nexport interface RouterInput {\n app: OonAppConfig;\n menu: OonMenuItem[];\n routes: OonRoute[];\n corePublicRoutes?: OonRoute[];\n onboardingEnabled?: boolean;\n security?: OonSecurityConfig;\n layout?: OonLayoutConfig;\n registry?: OonComponentRegistry;\n systemPages?: OonSystemPages;\n}\n\nexport function createOonRouter({ app, menu, routes, corePublicRoutes = [], onboardingEnabled, security, layout, registry, systemPages }: RouterInput) {\n const guardEnabled = security?.enableRouteGuard !== false;\n\n const publicRoutes: RouteObject[] = routes\n .filter((route) => route.public)\n .map((route) => ({ path: route.path, element: routeElement(route) }));\n\n const privateSource = routes.filter((route) => !route.public);\n const privateRoutes: RouteObject[] = privateSource.map((route) => {\n const content = routeElement(route);\n const element = guardEnabled ? (\n <RouteGuard permission={route.permissions}>{content}</RouteGuard>\n ) : content;\n return route.path === \"/\"\n ? { index: true, element }\n : { path: route.path.replace(/^\\//, \"\"), element };\n });\n\n const hasIndexRoute = privateSource.some((route) => route.path === \"/\");\n const firstRoute = privateSource.find((route) => route.path !== \"/\");\n if (!hasIndexRoute && firstRoute) {\n privateRoutes.unshift({ index: true, element: <Navigate to={firstRoute.path} replace /> });\n }\n\n const customPaths = new Set(publicRoutes.map((route) => route.path));\n const reservedCollision = [...customPaths].find((path) => OON_RESERVED_ROUTES.includes(String(path)));\n if (reservedCollision) throw new Error(`Rota reservada pelo OonCore: ${reservedCollision}.`);\n\n const coreRouteObjects: RouteObject[] = corePublicRoutes.map((route) => ({\n path: route.path,\n element: routeElement(route),\n }));\n const occupiedPaths = new Set([\n ...customPaths,\n ...corePublicRoutes.map((route) => route.path),\n ]);\n const builtInPublicRoutes: RouteObject[] = [...coreRouteObjects];\n\n if (!occupiedPaths.has(\"/login\")) {\n const Login = systemPages?.login;\n builtInPublicRoutes.push({\n path: \"/login\",\n element: <ActivationGuard>{Login ? <Login /> : <LoginPage app={app} onboardingEnabled={onboardingEnabled} />}</ActivationGuard>,\n });\n }\n if (!occupiedPaths.has(\"/accept-invite\")) {\n builtInPublicRoutes.push({\n path: \"/accept-invite\",\n element: <ActivationGuard><AcceptInvitePage /></ActivationGuard>,\n });\n }\n if (!occupiedPaths.has(\"/first-access\")) {\n builtInPublicRoutes.push({\n path: \"/first-access\",\n element: <ActivationGuard><FirstAccessPage /></ActivationGuard>,\n });\n }\n if (!occupiedPaths.has(\"/ativacao\")) builtInPublicRoutes.push({ path: \"/ativacao\", element: <ActivationPage /> });\n if (!occupiedPaths.has(\"/instancia-suspensa\")) {\n builtInPublicRoutes.push({\n path: \"/instancia-suspensa\",\n element: <InstanceBlockedPage title=\"Instância suspensa\" message=\"Esta Central está suspensa.\" />,\n });\n }\n if (!occupiedPaths.has(\"/instancia-revogada\")) {\n builtInPublicRoutes.push({\n path: \"/instancia-revogada\",\n element: <InstanceBlockedPage title=\"Instância revogada\" message=\"Esta Central foi revogada.\" />,\n });\n }\n if (!occupiedPaths.has(\"/acesso-negado\")) {\n builtInPublicRoutes.push({ path: \"/acesso-negado\", element: <AccessDeniedPage app={app} /> });\n }\n\n const tree: RouteObject[] = [\n ...builtInPublicRoutes,\n ...publicRoutes,\n {\n path: \"/\",\n element: (\n <ActivationGuard>\n <AppAccessGuard>\n <AuthenticatedLayout app={app} menu={menu} layout={layout} registry={registry} />\n </AppAccessGuard>\n </ActivationGuard>\n ),\n children: privateRoutes,\n },\n ];\n\n return createBrowserRouter(tree);\n}\n","import { Box, Button, Flex, Spacer, Text } from \"@chakra-ui/react\";\nimport { Outlet, useNavigate } from \"react-router-dom\";\nimport type {\n OonAppConfig,\n OonComponentRegistry,\n OonLayoutConfig,\n OonMenuItem,\n} from \"../types\";\nimport { useOonAuth } from \"../security/AuthProvider\";\nimport { useCoreMetadata } from \"../api/ApiProvider\";\nimport { Sidebar } from \"./Sidebar\";\nimport { resolveComponent, MissingRenderer } from \"../app/componentRegistry\";\nimport {\n formatRuntimeDate,\n resolveRuntimeVersionInfo,\n shortCommit,\n} from \"../runtime/versionInfo\";\n\nfunction SettingsIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 15.25a3.25 3.25 0 1 0 0-6.5 3.25 3.25 0 0 0 0 6.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n />\n <path\n d=\"M19.43 12.98c.04-.32.07-.65.07-.98s-.03-.66-.08-.98l2.12-1.66-2-3.46-2.5 1a7.64 7.64 0 0 0-1.7-.98L15 3.25h-4l-.35 2.67c-.61.25-1.18.58-1.7.98l-2.5-1-2 3.46 2.12 1.66c-.04.32-.07.65-.07.98s.03.66.08.98l-2.12 1.66 2 3.46 2.5-1c.52.4 1.09.73 1.7.98l.34 2.67h4l.35-2.67a7.64 7.64 0 0 0 1.7-.98l2.5 1 2-3.46-2.12-1.66Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction resolveSettingsHref(menu: OonMenuItem[]): string | null {\n const explicit = menu.find((item) => item.action === \"settings\");\n if (explicit) return explicit.href;\n\n const settingsPage = menu.find((item) => item.href === \"/configuracoes\");\n if (settingsPage) return settingsPage.href;\n\n return null;\n}\n\nfunction CoreTopbar({ app, menu }: { app: OonAppConfig; menu: OonMenuItem[] }) {\n const { user, logout, hasPermission } = useOonAuth();\n const navigate = useNavigate();\n const metadataQuery = useCoreMetadata();\n const runtime = resolveRuntimeVersionInfo(app, metadataQuery.data);\n const centralVersion = runtime.centralVersion ?? \"não informada\";\n const backendVersion = metadataQuery.isLoading\n ? \"carregando\"\n : runtime.coreBackVersion ?? \"indisponível\";\n const updatedAt = formatRuntimeDate(runtime.updatedAt);\n const commit = shortCommit(runtime.commit);\n const versionParts = [\n `Central ${centralVersion}`,\n `Front ${runtime.coreFrontVersion}`,\n `Back ${backendVersion}`,\n updatedAt ? `Atualizado ${updatedAt}` : undefined,\n commit ? `Commit ${commit}` : undefined,\n ].filter(Boolean);\n const details = [\n `Central ${centralVersion}`,\n `OonCore front ${runtime.coreFrontVersion}`,\n `OonCore back ${backendVersion}`,\n runtime.environment ? `Ambiente ${runtime.environment}` : undefined,\n runtime.commit ? `Commit ${runtime.commit}` : undefined,\n runtime.releaseId ? `Release ${runtime.releaseId}` : undefined,\n runtime.startedAt ? `Backend iniciado ${formatRuntimeDate(runtime.startedAt)}` : undefined,\n ].filter(Boolean).join(\" · \");\n const settingsHref = resolveSettingsHref(\n menu.filter((item) => hasPermission(item.permissions)),\n );\n const tenant = user?.tenant as { nome?: string; slug?: string } | undefined;\n const tenantLabel = String(tenant?.nome || tenant?.slug || \"\").trim();\n\n return (\n <Flex\n as=\"header\"\n align=\"center\"\n minH=\"64px\"\n px={{ base: 4, lg: 6 }}\n py={3}\n borderBottomWidth=\"1px\"\n borderColor=\"border.default\"\n bg=\"surface.panel\"\n backdropFilter=\"blur(10px)\"\n position=\"sticky\"\n top={0}\n zIndex={10}\n >\n <Box minW={0} title={details}>\n <Text\n fontSize=\"xs\"\n fontWeight=\"600\"\n color=\"brand.500\"\n textTransform=\"uppercase\"\n letterSpacing=\"0.08em\"\n >\n Central Oon\n </Text>\n <Text fontSize=\"sm\" fontWeight=\"600\" color=\"text.primary\">\n {app.title ?? app.name}\n </Text>\n {tenantLabel ? (\n <Text fontSize=\"xs\" fontWeight=\"600\" color=\"brand.fg\" lineHeight=\"1.4\">\n Tenant: {tenantLabel}\n </Text>\n ) : null}\n <Text fontSize=\"10px\" color=\"text.muted\" lineHeight=\"1.35\">\n {versionParts.join(\" · \")}\n </Text>\n </Box>\n <Spacer />\n {user ? (\n <Flex align=\"center\" gap={3}>\n <Box textAlign=\"right\" display={{ base: \"none\", md: \"block\" }}>\n <Text fontSize=\"sm\" fontWeight=\"600\" color=\"text.primary\">\n {user.nome}\n </Text>\n {user.email ? <Text fontSize=\"xs\" color=\"text.muted\">{user.email}</Text> : null}\n </Box>\n {settingsHref ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n colorPalette=\"brand\"\n borderRadius=\"8px\"\n minW=\"36px\"\n px={2}\n aria-label=\"Abrir configurações\"\n title=\"Configurações\"\n onClick={() => navigate(settingsHref)}\n >\n <SettingsIcon />\n </Button>\n ) : null}\n <Button\n size=\"sm\"\n variant=\"outline\"\n colorPalette=\"brand\"\n borderRadius=\"8px\"\n onClick={logout}\n >\n Sair\n </Button>\n </Flex>\n ) : null}\n </Flex>\n );\n}\n\nfunction Slot({\n name,\n slot,\n registry,\n app,\n menu,\n}: {\n name: \"sidebar\" | \"topbar\" | \"header\" | \"footer\";\n slot?: string;\n registry?: OonComponentRegistry;\n app: OonAppConfig;\n menu: OonMenuItem[];\n}) {\n if (slot === \"none\") return null;\n if (slot?.startsWith(\"custom:\")) {\n const Component = resolveComponent(registry, slot, \"layoutSlots\");\n return Component\n ? <Component app={app} menu={menu} />\n : <MissingRenderer renderer={slot} />;\n }\n if (name === \"sidebar\") return <Sidebar app={app} menu={menu} registry={registry} />;\n if (name === \"topbar\") return <CoreTopbar app={app} menu={menu} />;\n if (name === \"footer\" && slot === \"core\") {\n return (\n <Box as=\"footer\" px={6} py={4} color=\"gray.500\" fontSize=\"xs\" borderTopWidth=\"1px\">\n OonCore\n </Box>\n );\n }\n return null;\n}\n\nexport function DefaultShell({\n app,\n menu,\n layout,\n registry,\n}: {\n app: OonAppConfig;\n menu: OonMenuItem[];\n layout?: OonLayoutConfig;\n registry?: OonComponentRegistry;\n}) {\n const portal = layout?.shell === \"portal\" || layout?.shell === \"content-only\";\n const mainPadding = portal ? { base: 4, lg: 10 } : { base: 4, lg: 6 };\n return (\n <Flex align=\"stretch\" minH=\"100vh\" bg={portal ? \"surface.panel\" : \"surface.canvas\"}>\n <Slot\n name=\"sidebar\"\n slot={layout?.sidebar ?? \"core\"}\n registry={registry}\n app={app}\n menu={menu}\n />\n <Flex direction=\"column\" flex=\"1\" minW={0}>\n <Slot\n name=\"topbar\"\n slot={layout?.topbar ?? \"core\"}\n registry={registry}\n app={app}\n menu={menu}\n />\n <Slot name=\"header\" slot={layout?.header} registry={registry} app={app} menu={menu} />\n <Box as=\"main\" flex=\"1\" p={mainPadding} minW={0}>\n <Box maxW={portal ? \"1180px\" : \"1680px\"} mx=\"auto\">\n <Outlet />\n </Box>\n </Box>\n <Slot\n name=\"footer\"\n slot={layout?.footer ?? \"none\"}\n registry={registry}\n app={app}\n menu={menu}\n />\n </Flex>\n </Flex>\n );\n}\n\nexport function PortalShell(props: {\n app: OonAppConfig;\n menu: OonMenuItem[];\n layout?: OonLayoutConfig;\n registry?: OonComponentRegistry;\n}) {\n return <DefaultShell {...props} layout={{ ...props.layout, shell: \"portal\" }} />;\n}\n","import { Box, Flex, Image, Spinner, Stack, Text } from \"@chakra-ui/react\";\nimport { useState } from \"react\";\nimport { NavLink } from \"react-router-dom\";\nimport type { OonAppConfig, OonComponentRegistry, OonMenuItem } from \"../types\";\nimport { resolveComponent } from \"../app/componentRegistry\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { useOonAuth } from \"../security/AuthProvider\";\n\ntype PortalHome = {\n platformApps: Array<{\n app: { codigo: string; nome?: string };\n action: string;\n deployment: { environment?: string | null };\n }>;\n};\n\nfunction groupBySection(items: OonMenuItem[]): Array<[string, OonMenuItem[]]> {\n const groups = new Map<string, OonMenuItem[]>();\n for (const item of items) {\n const section = item.section ?? \"Geral\";\n if (!groups.has(section)) groups.set(section, []);\n groups.get(section)!.push(item);\n }\n return Array.from(groups.entries());\n}\n\nfunction launchAppCode(action?: string) {\n const match = /^launch-app:([a-z][a-z0-9-]{2,62})$/.exec(String(action || \"\"));\n return match?.[1] || \"\";\n}\n\nfunction errorMessage(error: unknown) {\n const value = error as {\n message?: string;\n response?: { data?: { message?: string; error?: { message?: string } } };\n };\n return value?.response?.data?.error?.message ||\n value?.response?.data?.message ||\n value?.message ||\n \"Não foi possível abrir o App.\";\n}\n\nfunction PlatformAppMenuItem({ item, appCode }: { item: OonMenuItem; appCode: string }) {\n const { http } = useOonApi();\n const [opening, setOpening] = useState(false);\n const [launchError, setLaunchError] = useState(\"\");\n\n async function launch() {\n if (opening) return;\n // A aba precisa nascer durante o gesto do usuário para não ser bloqueada.\n // O handshake continua assíncrono sem alterar a rota da aplicação atual.\n const popup = window.open(\"about:blank\", \"_blank\");\n if (!popup) {\n setLaunchError(\"Permita pop-ups para abrir o App em uma nova aba.\");\n return;\n }\n popup.opener = null;\n setOpening(true);\n setLaunchError(\"\");\n try {\n const home = (await http.get<PortalHome>(\"/portal/home\")).data;\n const target = home.platformApps.find((candidate) => candidate.app.codigo === appCode);\n if (!target || target.action !== \"open\") {\n throw new Error(`${target?.app.nome || item.label} ainda não está disponível.`);\n }\n const response = await http.post<{ openUrl: string }>(\"/portal/launch\", {\n appCode,\n environment: target.deployment.environment,\n });\n if (!response.data.openUrl) {\n throw new Error(\"A autorização de abertura não retornou uma URL.\");\n }\n popup.location.replace(response.data.openUrl);\n } catch (error) {\n popup.close();\n setLaunchError(errorMessage(error));\n } finally {\n setOpening(false);\n }\n }\n\n return (\n <Box width=\"100%\">\n <Flex\n as=\"button\"\n width=\"100%\"\n align=\"center\"\n justify={{ base: \"center\", lg: \"flex-start\" }}\n gap={3}\n px={{ base: 2, lg: 3 }}\n py=\"10px\"\n borderRadius=\"9px\"\n fontSize=\"13px\"\n fontWeight=\"500\"\n color=\"#46545C\"\n cursor={opening ? \"wait\" : \"pointer\"}\n aria-disabled={opening}\n pointerEvents={opening ? \"none\" : \"auto\"}\n title={item.label}\n aria-label={`Abrir ${item.label} em uma nova aba`}\n onClick={() => void launch()}\n _hover={{ bg: \"#F8F9FA\", color: \"brand.700\" }}\n >\n {opening\n ? <Spinner size=\"xs\" />\n : <Box w=\"7px\" h=\"7px\" borderRadius=\"full\" bg=\"gray.300\" />}\n <Text display={{ base: \"none\", lg: \"block\" }} lineClamp={1}>\n {item.label}\n </Text>\n </Flex>\n {launchError ? (\n <Text role=\"alert\" px={3} py={1} fontSize=\"10px\" color=\"red.600\">\n {launchError}\n </Text>\n ) : null}\n </Box>\n );\n}\n\n/** Menu lateral compacto e agrupado, seguindo o padrão operacional Minexco. */\nexport function Sidebar({ app, menu, registry }: { app: OonAppConfig; menu: OonMenuItem[]; registry?: OonComponentRegistry }) {\n const { hasPermission } = useOonAuth();\n const visible = menu.filter((item) => !item.hidden && hasPermission(item.permissions));\n\n return (\n <Box\n as=\"nav\"\n w={{ base: \"76px\", lg: \"248px\" }}\n minH=\"100vh\"\n borderRightWidth=\"1px\"\n borderColor=\"#E8ECEF\"\n px={{ base: 2, lg: 3 }}\n py={4}\n bg=\"white\"\n position=\"sticky\"\n top={0}\n alignSelf=\"flex-start\"\n overflowY=\"auto\"\n >\n <Flex align=\"center\" gap={3} mb={6} px={{ base: 1, lg: 2 }} minH=\"42px\">\n {app.logo ? (\n <Image src={app.logo} alt={app.name} maxH=\"36px\" maxW={{ base: \"44px\", lg: \"150px\" }} objectFit=\"contain\" />\n ) : (\n <Flex\n w=\"38px\"\n h=\"38px\"\n flex=\"0 0 auto\"\n borderRadius=\"12px\"\n align=\"center\"\n justify=\"center\"\n bg=\"brand.500\"\n color=\"white\"\n fontWeight=\"700\"\n fontSize=\"lg\"\n >\n O\n </Flex>\n )}\n <Box display={{ base: \"none\", lg: \"block\" }} minW={0}>\n <Text fontWeight=\"700\" fontSize=\"sm\" color=\"#07262E\" lineClamp={1}>\n {app.name}\n </Text>\n <Text fontSize=\"10px\" color=\"gray.500\" textTransform=\"uppercase\" letterSpacing=\"0.08em\">\n Operação digital\n </Text>\n </Box>\n </Flex>\n\n <Stack gap={5}>\n {groupBySection(visible).map(([section, items]) => (\n <Stack key={section} gap={1}>\n <Text\n display={{ base: \"none\", lg: \"block\" }}\n fontSize=\"10px\"\n fontWeight=\"600\"\n color=\"gray.400\"\n textTransform=\"uppercase\"\n letterSpacing=\"0.08em\"\n px={3}\n mb={1}\n >\n {section}\n </Text>\n {items.map((item) => {\n const CustomMenuItem = resolveComponent(registry, item.renderer, \"menuRenderers\");\n if (CustomMenuItem) return <CustomMenuItem key={item.href} item={item} />;\n const appCode = launchAppCode(item.action);\n if (appCode) return <PlatformAppMenuItem key={item.href} item={item} appCode={appCode} />;\n return (\n <NavLink key={item.href} to={item.href} end={item.href === \"/\"} title={item.label}>\n {({ isActive }) => (\n <Flex\n align=\"center\"\n justify={{ base: \"center\", lg: \"flex-start\" }}\n gap={3}\n px={{ base: 2, lg: 3 }}\n py=\"10px\"\n borderRadius=\"9px\"\n fontSize=\"13px\"\n fontWeight={isActive ? \"600\" : \"500\"}\n bg={isActive ? \"brand.50\" : \"transparent\"}\n color={isActive ? \"brand.700\" : \"#46545C\"}\n borderLeftWidth=\"3px\"\n borderLeftColor={isActive ? \"brand.500\" : \"transparent\"}\n transition=\"all 0.15s ease\"\n _hover={{ bg: isActive ? \"brand.50\" : \"#F8F9FA\", color: \"brand.700\" }}\n >\n {item.icon ? <Box flex=\"0 0 auto\">{item.icon}</Box> : <Box w=\"7px\" h=\"7px\" borderRadius=\"full\" bg={isActive ? \"brand.500\" : \"gray.300\"} />}\n <Text display={{ base: \"none\", lg: \"block\" }} lineClamp={1}>\n {item.label}\n </Text>\n </Flex>\n )}\n </NavLink>\n );\n })}\n </Stack>\n ))}\n </Stack>\n </Box>\n );\n}\n","{\n \"name\": \"@oondemand/oon-core-front\",\n \"version\": \"0.7.9\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/oondemand/oon-platform.git\",\n \"directory\": \"packages/oonCore-front\"\n },\n \"description\": \"Core de frontend para Centrais Oon: shell, providers, roteamento por metadata, SDK REST do /core/*, RBAC e componentes Core* (Coleção, Documento, Esteira, Multi-moedas, Assistente, Dashboard).\",\n \"type\": \"module\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./ui\": {\n \"types\": \"./dist/ui.d.ts\",\n \"import\": \"./dist/ui.js\"\n },\n \"./routing\": {\n \"types\": \"./dist/routing.d.ts\",\n \"import\": \"./dist/routing.js\"\n },\n \"./theme\": {\n \"types\": \"./dist/theme.d.ts\",\n \"import\": \"./dist/theme.js\"\n },\n \"./hooks\": {\n \"types\": \"./dist/hooks.d.ts\",\n \"import\": \"./dist/hooks.js\"\n },\n \"./testing\": {\n \"types\": \"./dist/testing.d.ts\",\n \"import\": \"./dist/testing.js\"\n }\n },\n \"bin\": {\n \"oonCore-front\": \"bin/cli.js\"\n },\n \"files\": [\n \"bin\",\n \"dist\",\n \"README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"prepublishOnly\": \"npm run build\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"keywords\": [\n \"oondemand\",\n \"ooncore\",\n \"central\",\n \"frontend\",\n \"metadata-driven\",\n \"react\",\n \"vite\"\n ],\n \"license\": \"SEE LICENSE IN LICENSE\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"dependencies\": {\n \"axios\": \"^1.7.7\"\n },\n \"peerDependencies\": {\n \"@chakra-ui/react\": \"^3.0.0\",\n \"@tanstack/react-query\": \"^5.0.0\",\n \"@tanstack/react-table\": \"^8.0.0\",\n \"react\": \"^18.0.0\",\n \"react-dom\": \"^18.0.0\",\n \"react-router-dom\": \"^6.0.0\"\n },\n \"devDependencies\": {\n \"@testing-library/dom\": \"^10.4.1\",\n \"@testing-library/react\": \"^16.3.2\",\n \"@types/react\": \"^18.3.18\",\n \"@types/react-dom\": \"^18.3.5\",\n \"happy-dom\": \"^20.10.2\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.0.0\"\n }\n}\n","import frontPackage from \"../../package.json\";\nimport type { CoreMetadata, OonAppConfig } from \"../types\";\n\nexport interface RuntimeVersionInfo {\n centralVersion?: string;\n coreFrontVersion: string;\n coreBackVersion?: string;\n updatedAt?: string;\n startedAt?: string;\n commit?: string;\n releaseId?: string;\n environment?: string;\n}\n\ninterface RuntimeMetadataExtension {\n runtime?: {\n core?: {\n backendVersion?: string;\n };\n central?: {\n version?: string;\n };\n deployment?: {\n builtAt?: string;\n startedAt?: string;\n commit?: string;\n releaseId?: string;\n environment?: string;\n };\n };\n}\n\ntype RuntimeMetadata = CoreMetadata & RuntimeMetadataExtension;\ntype BuildEnvironment = Record<string, string | undefined>;\n\nfunction value(...candidates: Array<string | undefined>): string | undefined {\n return candidates.find((candidate) => typeof candidate === \"string\" && candidate.trim())?.trim();\n}\n\nfunction browserBuildEnvironment(): BuildEnvironment {\n return (import.meta.env ?? {}) as BuildEnvironment;\n}\n\nexport function resolveRuntimeVersionInfo(\n app: OonAppConfig,\n metadata?: CoreMetadata,\n environment: BuildEnvironment = browserBuildEnvironment(),\n): RuntimeVersionInfo {\n const extended = metadata as RuntimeMetadata | undefined;\n const runtime = extended?.runtime;\n const deployment = runtime?.deployment;\n\n return {\n centralVersion: value(\n environment.VITE_OON_CENTRAL_VERSION,\n app.version,\n runtime?.central?.version,\n ),\n coreFrontVersion: frontPackage.version,\n coreBackVersion: value(runtime?.core?.backendVersion, metadata?.service?.version),\n updatedAt: value(\n environment.VITE_OON_BUILD_TIME,\n deployment?.builtAt,\n deployment?.startedAt,\n ),\n startedAt: deployment?.startedAt,\n commit: value(environment.VITE_OON_BUILD_COMMIT, deployment?.commit),\n releaseId: value(environment.VITE_OON_RELEASE_ID, deployment?.releaseId),\n environment: value(environment.VITE_OON_ENVIRONMENT, deployment?.environment),\n };\n}\n\nexport function formatRuntimeDate(valueToFormat?: string, timeZone?: string): string | undefined {\n if (!valueToFormat) return undefined;\n const date = new Date(valueToFormat);\n if (Number.isNaN(date.getTime())) return valueToFormat;\n return new Intl.DateTimeFormat(\"pt-BR\", {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n // Sem fuso explícito, Intl usa o fuso local do navegador do operador.\n timeZone,\n }).format(date);\n}\n\nexport function shortCommit(commit?: string): string | undefined {\n if (!commit) return undefined;\n return commit.length > 8 ? commit.slice(0, 8) : commit;\n}\n","import type { OonAppConfig, OonComponentRegistry, OonLayoutConfig, OonMenuItem } from \"../types\";\nimport { resolveComponent, MissingRenderer } from \"../app/componentRegistry\";\nimport { DefaultShell, PortalShell } from \"./DefaultShell\";\n\n/** Layout autenticado padrão mantido como wrapper de compatibilidade v1. */\nexport function AuthenticatedLayout({ app, menu, layout, registry }: { app: OonAppConfig; menu: OonMenuItem[]; layout?: OonLayoutConfig; registry?: OonComponentRegistry }) {\n if (layout?.shell?.startsWith(\"custom:\")) {\n const CustomShell = resolveComponent(registry, layout.shell, \"layoutSlots\");\n return CustomShell ? <CustomShell app={app} menu={menu} layout={layout} /> : <MissingRenderer renderer={layout.shell} />;\n }\n if (layout?.shell === \"portal\") return <PortalShell app={app} menu={menu} layout={layout} registry={registry} />;\n return <DefaultShell app={app} menu={menu} layout={layout} registry={registry} />;\n}\n","import { Box, Button, Flex, Heading, Text, VStack } from \"@chakra-ui/react\";\nimport { useNavigate } from \"react-router-dom\";\nimport type { OonAppConfig } from \"../types\";\nimport { useOonAuth } from \"./AuthProvider\";\n\n/** Página exibida quando o usuário está autenticado, mas não possui o app. */\nexport function AccessDeniedPage({ app }: { app: OonAppConfig }) {\n const { logout } = useOonAuth();\n const navigate = useNavigate();\n\n function useAnotherAccount() {\n logout();\n navigate(\"/login\", { replace: true });\n }\n\n return (\n <Flex minH=\"100vh\" align=\"center\" justify=\"center\" bg=\"#F5F8FA\" px={4}>\n <Box\n width=\"100%\"\n maxW=\"560px\"\n bg=\"white\"\n borderWidth=\"1px\"\n borderColor=\"#E4EBEF\"\n borderRadius=\"18px\"\n boxShadow=\"0 24px 70px rgba(7, 38, 46, 0.10)\"\n p={{ base: 6, md: 10 }}\n >\n <VStack align=\"stretch\" gap={6}>\n <Box\n width=\"56px\"\n height=\"56px\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius=\"16px\"\n bg=\"orange.50\"\n color=\"orange.700\"\n fontSize=\"2xl\"\n fontWeight=\"800\"\n aria-hidden=\"true\"\n >\n !\n </Box>\n\n <Box>\n <Text\n color=\"#39BFED\"\n fontSize=\"xs\"\n fontWeight=\"700\"\n letterSpacing=\"0.12em\"\n textTransform=\"uppercase\"\n >\n Acesso negado\n </Text>\n <Heading mt={2} size=\"lg\" color=\"#07262E\">\n Você não possui permissão para este aplicativo\n </Heading>\n <Text mt={3} color=\"gray.600\">\n Seu usuário foi autenticado, mas não existe uma permissão ativa\n para acessar {app.title ?? app.name}. Solicite o acesso ao\n administrador da sua organização.\n </Text>\n </Box>\n\n <Button\n alignSelf=\"flex-start\"\n bg=\"#07262E\"\n color=\"white\"\n _hover={{ bg: \"#0B3843\" }}\n onClick={useAnotherAccount}\n >\n Entrar com outra conta\n </Button>\n </VStack>\n </Box>\n </Flex>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Navigate, useLocation } from \"react-router-dom\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\nimport { useOonAuth } from \"./AuthProvider\";\n\nfunction loginRedirect(pathname: string, search: string): string {\n const destination = `${pathname}${search}`;\n return `/login?redirect=${encodeURIComponent(destination)}`;\n}\n\nexport function AppAccessGuard({ children }: { children: ReactNode }) {\n const { status, retry } = useOonAuth();\n const location = useLocation();\n\n if (status === \"loading\") return <LoadingScreen />;\n if (status === \"unauthenticated\") {\n return <Navigate to={loginRedirect(location.pathname, location.search)} replace />;\n }\n if (status === \"first-access\") return <Navigate to=\"/first-access\" replace />;\n if (status === \"forbidden\") return <Navigate to=\"/acesso-negado\" replace />;\n if (status === \"error\") {\n return (\n <LoadingScreen\n message=\"Não foi possível validar seu acesso. Tente novamente.\"\n actionLabel=\"Tentar novamente\"\n onAction={() => { void retry().catch(() => undefined); }}\n />\n );\n }\n return <>{children}</>;\n}\n","import { useState, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, SimpleGrid, Text, VStack } from \"@chakra-ui/react\";\nimport { Link, Navigate, useLocation } from \"react-router-dom\";\nimport type { OonAppConfig, OonError } from \"../types\";\nimport { useOonAuth } from \"./AuthProvider\";\n\ntype TenantOption = {\n id: string;\n nome: string;\n slug?: string;\n tipo?: string;\n status?: string;\n};\n\nfunction tenantOptions(error: OonError): TenantOption[] {\n const details = error.details;\n if (!details || typeof details !== \"object\" || Array.isArray(details)) return [];\n const tenants = (details as { tenants?: unknown }).tenants;\n if (!Array.isArray(tenants)) return [];\n return tenants\n .filter((tenant): tenant is Record<string, unknown> => Boolean(tenant) && typeof tenant === \"object\")\n .map((tenant) => ({\n id: String(tenant.id || \"\"),\n nome: String(tenant.nome || tenant.slug || tenant.id || \"\"),\n slug: tenant.slug ? String(tenant.slug) : undefined,\n tipo: tenant.tipo ? String(tenant.tipo) : undefined,\n status: tenant.status ? String(tenant.status) : undefined,\n }))\n .filter((tenant) => tenant.id && tenant.nome);\n}\n\nfunction safeRedirect(search: string): string {\n const value = new URLSearchParams(search).get(\"redirect\") || \"/\";\n if (!value.startsWith(\"/\") || value.startsWith(\"//\")) return \"/\";\n if (value.startsWith(\"/login\") || value.startsWith(\"/acesso-negado\")) return \"/\";\n return value;\n}\n\nfunction tenantUrl(path: string, tenantId: string): string {\n const target = new URL(path, window.location.origin);\n target.searchParams.set(\"tenant\", tenantId);\n return target.toString();\n}\n\n/** Tela de login padrão das Centrais que usam a Central de Ativações. */\nexport function LoginPage({ app, onboardingEnabled = false }: { app: OonAppConfig; onboardingEnabled?: boolean }) {\n const { status, login } = useOonAuth();\n const location = useLocation();\n const [email, setEmail] = useState(\"\");\n const [password, setPassword] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n const [tenants, setTenants] = useState<TenantOption[]>([]);\n const [selectorMode, setSelectorMode] = useState(false);\n const [openingTenant, setOpeningTenant] = useState<string | null>(null);\n const redirect = safeRedirect(location.search);\n\n if (status === \"authenticated\" && !selectorMode) return <Navigate to={redirect} replace />;\n if (status === \"forbidden\") return <Navigate to=\"/acesso-negado\" replace />;\n\n async function handleSubmit(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (tenants.length > 1) return;\n setSubmitting(true);\n setMessage(null);\n try {\n await login(email.trim(), password);\n } catch (error) {\n const authError = error as OonError;\n if (authError.code === \"TENANT_SELECTION_REQUIRED\") {\n const options = tenantOptions(authError);\n if (options.length > 1) {\n setTenants(options);\n setMessage(\"Escolha uma organização. O tenant será aberto em uma nova aba.\");\n return;\n }\n }\n if (authError.status === 403) return;\n setMessage(authError.status === 401 ? \"E-mail ou senha inválidos.\" : authError.message || \"Não foi possível entrar. Tente novamente.\");\n } finally {\n setSubmitting(false);\n }\n }\n\n async function openTenant(tenant: TenantOption) {\n if (openingTenant) return;\n const popup = window.open(\"about:blank\", \"_blank\");\n if (!popup) {\n setMessage(\"Permita pop-ups para abrir o tenant em uma nova aba.\");\n return;\n }\n popup.opener = null;\n setOpeningTenant(tenant.id);\n setSelectorMode(true);\n setMessage(null);\n try {\n if (status !== \"authenticated\") await login(email.trim(), password, tenant.id);\n popup.location.replace(tenantUrl(redirect, tenant.id));\n setPassword(\"\");\n setMessage(`${tenant.nome} foi aberto em uma nova aba. Escolha outro tenant quando precisar.`);\n } catch (error) {\n popup.close();\n const authError = error as OonError;\n setMessage(authError.message || \"Não foi possível abrir o tenant.\");\n } finally {\n setOpeningTenant(null);\n }\n }\n\n return (\n <Flex minH=\"100vh\" align=\"center\" justify=\"center\" bg=\"#F5F8FA\" px={4}>\n <Box width=\"100%\" maxW={tenants.length > 1 ? \"760px\" : \"440px\"} bg=\"white\" borderWidth=\"1px\" borderColor=\"#E4EBEF\" borderRadius=\"18px\" boxShadow=\"0 24px 70px rgba(7, 38, 46, 0.10)\" p={{ base: 6, md: 9 }}>\n <form onSubmit={handleSubmit}>\n <VStack align=\"stretch\" gap={6}>\n <Box>\n <Text color=\"#39BFED\" fontSize=\"xs\" fontWeight=\"700\" letterSpacing=\"0.12em\" textTransform=\"uppercase\">Central Oon</Text>\n <Heading mt={2} size=\"lg\" color=\"#07262E\">{app.title ?? app.name}</Heading>\n <Text mt={2} color=\"gray.600\" fontSize=\"sm\">\n {tenants.length > 1 ? \"Abra uma ou mais organizações para trabalhar em contextos separados.\" : \"Entre com seu usuário autorizado para acessar este aplicativo.\"}\n </Text>\n </Box>\n\n {tenants.length <= 1 ? (\n <VStack align=\"stretch\" gap={4}>\n <Box>\n <Text mb={2} fontSize=\"sm\" fontWeight=\"600\" color=\"#24323A\">E-mail</Text>\n <Input type=\"email\" value={email} onChange={(event) => { setEmail(event.target.value); setTenants([]); setSelectorMode(false); }} autoComplete=\"email\" placeholder=\"voce@empresa.com.br\" required />\n </Box>\n <Box>\n <Text mb={2} fontSize=\"sm\" fontWeight=\"600\" color=\"#24323A\">Senha</Text>\n <Input type=\"password\" value={password} onChange={(event) => setPassword(event.target.value)} autoComplete=\"current-password\" placeholder=\"Sua senha\" required />\n </Box>\n </VStack>\n ) : (\n <Box>\n <Text mb={3} fontSize=\"sm\" fontWeight=\"600\" color=\"#24323A\">Escolha o tenant para acessar</Text>\n <SimpleGrid columns={{ base: 1, md: 2 }} gap={3}>\n {tenants.map((tenant) => (\n <Button key={tenant.id} type=\"button\" variant=\"outline\" height=\"auto\" minH=\"104px\" justifyContent=\"flex-start\" whiteSpace=\"normal\" textAlign=\"left\" borderWidth=\"2px\" borderColor=\"#D9E2E7\" bg=\"white\" color=\"#24323A\" disabled={Boolean(openingTenant)} aria-label={`Abrir ${tenant.nome} em nova aba`} onClick={() => void openTenant(tenant)} _hover={{ borderColor: \"#39BFED\", bg: \"#F6FCFE\" }}>\n <VStack align=\"start\" gap={1} py={3}>\n <Text fontWeight=\"700\">{tenant.nome}</Text>\n <Text fontSize=\"xs\" color=\"gray.500\">{[tenant.slug, tenant.tipo, tenant.status].filter(Boolean).join(\" · \")}</Text>\n <Text fontSize=\"xs\" color=\"#168EB9\">{openingTenant === tenant.id ? \"Abrindo...\" : \"Abrir em nova aba\"}</Text>\n </VStack>\n </Button>\n ))}\n </SimpleGrid>\n </Box>\n )}\n\n {message ? <Box role=\"status\" borderRadius=\"10px\" bg=\"blue.50\" color=\"blue.800\" px={4} py={3} fontSize=\"sm\">{message}</Box> : null}\n\n {tenants.length <= 1 ? (\n <Button type=\"submit\" bg=\"#07262E\" color=\"white\" _hover={{ bg: \"#0B3843\" }} disabled={submitting || !email.trim() || !password}>\n {submitting ? \"Validando acesso...\" : \"Entrar\"}\n </Button>\n ) : null}\n {app.kind === \"portal-cockpit\" && onboardingEnabled && tenants.length <= 1 ? (\n <Text textAlign=\"center\" fontSize=\"sm\" color=\"gray.600\">Ainda não possui acesso? <Link to=\"/cadastro\">Criar conta</Link></Text>\n ) : null}\n </VStack>\n </form>\n </Box>\n </Flex>\n );\n}\n\n","import { useState, type FormEvent } from \"react\";\nimport { Box, Button, Flex, Heading, Input, Text, VStack } from \"@chakra-ui/react\";\nimport { Navigate } from \"react-router-dom\";\nimport { useOonAuth } from \"./AuthProvider\";\n\nexport function FirstAccessPage() {\n const { status, completeFirstAccess } = useOonAuth();\n const [password, setPassword] = useState(\"\");\n const [confirm, setConfirm] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [message, setMessage] = useState<string | null>(null);\n\n if (status === \"authenticated\") return <Navigate to=\"/\" replace />;\n if (status === \"unauthenticated\") return <Navigate to=\"/login\" replace />;\n if (status === \"forbidden\") return <Navigate to=\"/acesso-negado\" replace />;\n\n async function submit(event: FormEvent) {\n event.preventDefault();\n setMessage(null);\n if (password.length < 8) {\n setMessage(\"A senha deve possuir pelo menos 8 caracteres.\");\n return;\n }\n if (password !== confirm) {\n setMessage(\"As senhas informadas não conferem.\");\n return;\n }\n setSubmitting(true);\n try {\n await completeFirstAccess(password);\n } catch (error: any) {\n setMessage(error?.message || \"Não foi possível definir a nova senha.\");\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <Flex minH=\"100vh\" align=\"center\" justify=\"center\" bg=\"#F5F8FA\" px={4}>\n <Box width=\"100%\" maxW=\"460px\" bg=\"white\" borderWidth=\"1px\" borderRadius=\"18px\" p={{ base: 6, md: 9 }}>\n <form onSubmit={(event) => void submit(event)}>\n <VStack align=\"stretch\" gap={5}>\n <Box>\n <Text color=\"#39BFED\" fontSize=\"xs\" fontWeight=\"700\" textTransform=\"uppercase\">Primeiro acesso</Text>\n <Heading mt={2} size=\"lg\">Defina sua nova senha</Heading>\n <Text mt={2} fontSize=\"sm\" color=\"gray.600\">O acesso à Central só será liberado depois desta etapa.</Text>\n </Box>\n <Box>\n <Text mb={1} fontSize=\"sm\" fontWeight=\"600\">Nova senha</Text>\n <Input type=\"password\" autoComplete=\"new-password\" value={password} onChange={(event) => setPassword(event.target.value)} required />\n </Box>\n <Box>\n <Text mb={1} fontSize=\"sm\" fontWeight=\"600\">Confirmar senha</Text>\n <Input type=\"password\" autoComplete=\"new-password\" value={confirm} onChange={(event) => setConfirm(event.target.value)} required />\n </Box>\n {message ? <Box role=\"alert\" bg=\"red.50\" borderRadius=\"md\" p={3}><Text fontSize=\"sm\">{message}</Text></Box> : null}\n <Button type=\"submit\" disabled={submitting}>{submitting ? \"Salvando…\" : \"Definir nova senha\"}</Button>\n </VStack>\n </form>\n </Box>\n </Flex>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { Box, Button, Heading, Input, Text, VStack } from \"@chakra-ui/react\";\nimport { useOonApi } from \"../api/ApiProvider\";\nimport { useActivation } from \"./ActivationProvider\";\n\ntype Field = {\n name: string;\n label: string;\n type: string;\n required?: boolean;\n defaultValue?: unknown;\n options?: string[];\n readOnly?: boolean;\n placeholder?: string;\n helpText?: string;\n minLength?: number;\n autoComplete?: string;\n};\n\ntype Preview = {\n tenant?: Record<string, unknown>;\n app?: Record<string, unknown>;\n licenca?: Record<string, unknown>;\n entitlement?: Record<string, unknown>;\n deployment?: Record<string, unknown>;\n binding?: Record<string, unknown>;\n ativacao?: Record<string, unknown>;\n};\n\ntype ActivationConfiguration = {\n mode: \"root-bootstrap\" | \"member-activation\";\n rootFields: Field[];\n globalFields: Field[];\n appFields: Field[];\n defaults: Record<string, unknown>;\n technical: Record<string, string>;\n};\n\ntype DevLocalActivationResult = {\n token?: string;\n appCode?: string;\n usuario?: Record<string, unknown>;\n tenant?: Record<string, unknown>;\n app?: Record<string, unknown>;\n licenca?: Record<string, unknown>;\n entitlement?: Record<string, unknown>;\n deployment?: Record<string, unknown>;\n binding?: Record<string, unknown>;\n instrucoes?: { env?: string; observacao?: string };\n};\n\nfunction encodeBasicCredentials(email: string, password: string): string {\n const bytes = new TextEncoder().encode(`${email}:${password}`);\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return window.btoa(binary);\n}\n\nexport function ActivationPage() {\n const { http } = useOonApi();\n const activation = useActivation();\n const [step, setStep] = useState(1);\n const [config, setConfig] = useState<ActivationConfiguration | null>(null);\n const [code, setCode] = useState(\"\");\n const [preview, setPreview] = useState<Preview | null>(null);\n const [global, setGlobal] = useState<Record<string, unknown>>({});\n const [app, setApp] = useState<Record<string, unknown>>({});\n const [rootEmail, setRootEmail] = useState(\"\");\n const [rootPassword, setRootPassword] = useState(\"\");\n const [devName, setDevName] = useState(\"\");\n const [devEmail, setDevEmail] = useState(\"\");\n const [devPassword, setDevPassword] = useState(\"\");\n const [showCodeFlow, setShowCodeFlow] = useState(false);\n const [devResult, setDevResult] = useState<DevLocalActivationResult | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [submitting, setSubmitting] = useState(false);\n\n useEffect(() => {\n http\n .get<ActivationConfiguration>(\"/ativacao/configuracao\")\n .then((response) => {\n setConfig(response.data);\n setGlobal(response.data.defaults || {});\n })\n .catch(() =>\n setError(\"Não foi possível carregar a configuração de ativação.\"),\n );\n }, [http]);\n\n useEffect(() => {\n if (activation.status === \"active\") {\n window.location.replace(\"/login\");\n }\n }, [activation.status]);\n\n async function activateRoot() {\n setSubmitting(true);\n setError(null);\n\n try {\n await http.post(\"/ativacao/ativar-root\", {\n email: rootEmail.trim(),\n senha: rootPassword,\n });\n setRootPassword(\"\");\n setStep(6);\n await activation.refresh();\n window.setTimeout(() => window.location.replace(\"/login\"), 900);\n } catch (caught) {\n setRootPassword(\"\");\n setError(\n (caught as Error).message ||\n \"Não foi possível concluir a ativação inicial.\",\n );\n } finally {\n setSubmitting(false);\n }\n }\n\n async function activateDevLocal() {\n setSubmitting(true);\n setError(null);\n\n try {\n const response = await http.post<DevLocalActivationResult>(\n \"/ativacao/ativar-dev-local\",\n {\n nomeUsuario: devName.trim() || undefined,\n nomeCentral: global.nomeInstancia || config?.defaults?.nomeInstancia,\n appName: config?.defaults?.nomeInstancia || config?.technical?.appCode,\n urlPublica: global.urlPublica,\n },\n {\n headers: {\n Authorization: `Basic ${encodeBasicCredentials(\n devEmail.trim().toLowerCase(),\n devPassword,\n )}`,\n },\n },\n );\n\n setDevPassword(\"\");\n setDevResult(response.data);\n setStep(6);\n\n const token = response.data.token;\n window.setTimeout(() => {\n window.location.replace(token ? `/?code=${encodeURIComponent(token)}` : \"/login\");\n }, 900);\n } catch (caught) {\n setDevPassword(\"\");\n setError(\n (caught as Error).message ||\n \"Não foi possível ativar a Central em desenvolvimento.\",\n );\n } finally {\n setSubmitting(false);\n }\n }\n\n async function validateCode() {\n setSubmitting(true);\n setError(null);\n\n try {\n const response = await http.post(\"/ativacao/validar-codigo\", {\n codigoAtivacao: code,\n });\n setPreview(response.data);\n setStep(2);\n } catch (caught) {\n setError((caught as Error).message || \"Código inválido.\");\n } finally {\n setSubmitting(false);\n }\n }\n\n async function completeMemberActivation() {\n setSubmitting(true);\n setError(null);\n\n try {\n await http.post(\"/ativacao/concluir\", {\n codigoAtivacao: code,\n nomeInstancia: global.nomeInstancia,\n parametrosGlobais: global,\n parametrosAplicacao: app,\n });\n setStep(6);\n setCode(\"\");\n await activation.refresh();\n window.setTimeout(() => window.location.replace(\"/login\"), 1200);\n } catch (caught) {\n setError(\n (caught as Error).message ||\n \"Não foi possível concluir a ativação.\",\n );\n } finally {\n setSubmitting(false);\n }\n }\n\n function renderField(\n field: Field,\n values: Record<string, unknown>,\n setValues: (value: Record<string, unknown>) => void,\n ) {\n return (\n <Box key={field.name} w=\"100%\">\n <Text fontWeight=\"medium\">\n {field.label}\n {field.required ? \" *\" : \"\"}\n </Text>\n <Input\n type={\n field.type === \"password\" || field.type === \"secret\"\n ? \"password\"\n : field.type === \"email\"\n ? \"email\"\n : field.type === \"url\"\n ? \"url\"\n : field.type === \"number\" || field.type === \"integer\"\n ? \"number\"\n : \"text\"\n }\n value={String(values[field.name] ?? field.defaultValue ?? \"\")}\n readOnly={field.readOnly}\n placeholder={field.placeholder}\n minLength={field.minLength}\n autoComplete={field.autoComplete}\n onChange={(event) =>\n setValues({ ...values, [field.name]: event.target.value })\n }\n />\n {field.helpText ? (\n <Text fontSize=\"sm\" color=\"gray.500\">\n {field.helpText}\n </Text>\n ) : null}\n </Box>\n );\n }\n\n function renderDevLocalActivation() {\n return (\n <>\n <Text color=\"gray.700\">\n Entre com seu e-mail e senha para ativar esta Central em ambiente de\n desenvolvimento. Se o e-mail ainda não existir na Central de\n Ativações, o usuário será criado automaticamente com perfil de\n desenvolvedor.\n </Text>\n\n <Box w=\"100%\">\n <Text fontWeight=\"medium\">Nome do usuário</Text>\n <Input\n value={devName}\n onChange={(event) => setDevName(event.target.value)}\n placeholder=\"Seu nome\"\n autoComplete=\"name\"\n />\n </Box>\n\n <Box w=\"100%\">\n <Text fontWeight=\"medium\">E-mail *</Text>\n <Input\n type=\"email\"\n value={devEmail}\n onChange={(event) => setDevEmail(event.target.value)}\n placeholder=\"dev@empresa.com.br\"\n autoComplete=\"email\"\n />\n </Box>\n\n <Box w=\"100%\">\n <Text fontWeight=\"medium\">Senha *</Text>\n <Input\n type=\"password\"\n value={devPassword}\n onChange={(event) => setDevPassword(event.target.value)}\n placeholder=\"Mínimo de 8 caracteres\"\n minLength={8}\n autoComplete=\"current-password\"\n />\n </Box>\n\n <Button\n colorPalette=\"blue\"\n onClick={activateDevLocal}\n loading={submitting}\n disabled={\n submitting ||\n !devEmail.trim() ||\n devPassword.length < 8 ||\n !activation.details?.podeAtivar\n }\n >\n Ativar ambiente de desenvolvimento\n </Button>\n\n <Button\n variant=\"outline\"\n onClick={() => setShowCodeFlow(true)}\n disabled={submitting}\n >\n Usar código de ativação manual\n </Button>\n </>\n );\n }\n\n const rootMode =\n config?.mode === \"root-bootstrap\" || activation.details?.role === \"root\";\n const isDevelopmentMember =\n !rootMode && config?.technical?.ambiente === \"desenvolvimento\";\n\n if (activation.status === \"loading\" || !config) {\n return (\n <Box minH=\"100vh\" bg=\"gray.50\" p={8}>\n <VStack\n maxW=\"760px\"\n mx=\"auto\"\n bg=\"white\"\n p={8}\n borderRadius=\"lg\"\n align=\"stretch\"\n gap={5}\n >\n <Heading>Preparando ativação...</Heading>\n {error ? <Text color=\"red.600\">{error}</Text> : null}\n </VStack>\n </Box>\n );\n }\n\n if (rootMode) {\n return (\n <Box minH=\"100vh\" bg=\"gray.50\" p={8}>\n <VStack\n maxW=\"560px\"\n mx=\"auto\"\n bg=\"white\"\n p={8}\n borderRadius=\"lg\"\n align=\"stretch\"\n gap={5}\n >\n <Heading>Ativação inicial do Ecossistema Oon</Heading>\n <Text color=\"gray.600\">\n Esta é a aplicação root do ecossistema. Informe somente o e-mail e\n a senha do primeiro administrador. O Core criará a estrutura mínima\n necessária para liberar o primeiro login.\n </Text>\n <Text fontSize=\"sm\" color=\"gray.500\">\n App: {config.technical.appCode} · Ambiente:{\" \"}\n {config.technical.ambiente}\n </Text>\n\n {error ? <Text color=\"red.600\">{error}</Text> : null}\n\n {step !== 6 ? (\n <>\n <Box w=\"100%\">\n <Text fontWeight=\"medium\">E-mail do administrador *</Text>\n <Input\n type=\"email\"\n autoComplete=\"email\"\n value={rootEmail}\n onChange={(event) => setRootEmail(event.target.value)}\n placeholder=\"administrador@empresa.com.br\"\n />\n </Box>\n\n <Box w=\"100%\">\n <Text fontWeight=\"medium\">Senha *</Text>\n <Input\n type=\"password\"\n minLength={8}\n autoComplete=\"new-password\"\n value={rootPassword}\n onChange={(event) => setRootPassword(event.target.value)}\n placeholder=\"Mínimo de 8 caracteres\"\n />\n </Box>\n\n <Button\n colorPalette=\"blue\"\n onClick={activateRoot}\n loading={submitting}\n disabled={\n submitting ||\n !rootEmail.trim() ||\n rootPassword.length < 8 ||\n !activation.details?.podeAtivar\n }\n >\n Criar ecossistema e ativar\n </Button>\n </>\n ) : (\n <>\n <Heading size=\"md\">Ativação concluída</Heading>\n <Text>\n Usuário, acesso do sistema e aplicativo root foram preparados.\n Redirecionando para o primeiro login...\n </Text>\n </>\n )}\n </VStack>\n </Box>\n );\n }\n\n return (\n <Box minH=\"100vh\" bg=\"gray.50\" p={8}>\n <VStack\n maxW=\"760px\"\n mx=\"auto\"\n bg=\"white\"\n p={8}\n borderRadius=\"lg\"\n align=\"stretch\"\n gap={5}\n >\n <Heading>Ativação da Central Oon</Heading>\n <Text>\n App: {config.technical.appCode} · Ambiente:{\" \"}\n {config.technical.ambiente} · Central:{\" \"}\n {config.technical.centralAtivacaoUrl ||\n config.technical.centralAtivacaoHost}\n </Text>\n\n {error ? <Text color=\"red.600\">{error}</Text> : null}\n\n {step === 1 && isDevelopmentMember && !showCodeFlow\n ? renderDevLocalActivation()\n : null}\n\n {step === 1 && (!isDevelopmentMember || showCodeFlow) && (\n <>\n <Text>\n Informe o código de ativação para validar Tenant, App,\n Entitlement e Deployment. A licença será validada somente para\n Apps comerciais.\n </Text>\n <Input\n aria-label=\"Código de ativação\"\n value={code}\n onChange={(event) => setCode(event.target.value)}\n placeholder=\"OON-XXXX\"\n />\n <Button\n onClick={validateCode}\n loading={submitting}\n disabled={!code || submitting}\n >\n Validar código\n </Button>\n {isDevelopmentMember ? (\n <Button\n variant=\"outline\"\n onClick={() => setShowCodeFlow(false)}\n disabled={submitting}\n >\n Voltar para ativação com usuário\n </Button>\n ) : null}\n </>\n )}\n\n {step === 2 && (\n <>\n <Heading size=\"md\">Confirmação</Heading>\n <pre>{JSON.stringify(preview, null, 2)}</pre>\n <Button onClick={() => setStep(3)}>Continuar</Button>\n </>\n )}\n\n {step === 3 && (\n <>\n {config.globalFields.map((field) =>\n renderField(field, global, setGlobal),\n )}\n <Button onClick={() => setStep(4)}>Continuar</Button>\n </>\n )}\n\n {step === 4 && (\n <>\n {config.appFields.length ? (\n config.appFields.map((field) => renderField(field, app, setApp))\n ) : (\n <Text>Nenhum parâmetro adicional declarado.</Text>\n )}\n <Button onClick={() => setStep(5)}>Revisar</Button>\n </>\n )}\n\n {step === 5 && (\n <>\n <Text>\n Ao confirmar, o código será consumido e este runtime será\n vinculado ao Deployment do Ecossistema Oon.\n </Text>\n <Button\n colorPalette=\"blue\"\n onClick={completeMemberActivation}\n loading={submitting}\n disabled={submitting}\n >\n Concluir ativação\n </Button>\n </>\n )}\n\n {step === 6 && (\n <>\n <Heading size=\"md\">Ativação concluída</Heading>\n {devResult?.appCode ? (\n <Text>\n Código do app: {devResult.appCode}. Redirecionando para a\n Central em desenvolvimento...\n </Text>\n ) : (\n <Text>Redirecionando para o login...</Text>\n )}\n {devResult?.instrucoes?.env ? (\n <Text fontSize=\"sm\" color=\"gray.500\">\n {devResult.instrucoes.env}\n </Text>\n ) : null}\n </>\n )}\n </VStack>\n </Box>\n );\n}\n\nexport function InstanceBlockedPage({\n title,\n message,\n}: {\n title: string;\n message: string;\n}) {\n return (\n <Box p={8}>\n <Heading>{title}</Heading>\n <Text>{message}</Text>\n </Box>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useOonAuth } from \"./AuthProvider\";\nimport { LoadingScreen } from \"../shell/LoadingScreen\";\n\n/**\n * Protege rotas privadas: enquanto valida o token mostra loading; sem sessão\n * o AuthProvider já redireciona para o login externo, então aqui só seguramos\n * o render. `permission` opcional bloqueia por papel (UX; back valida de novo).\n */\nexport function RouteGuard({\n permission,\n children,\n}: {\n permission?: string | string[];\n children: ReactNode;\n}) {\n const { status, hasPermission } = useOonAuth();\n\n if (status === \"loading\") return <LoadingScreen />;\n if (status === \"unauthenticated\") return <LoadingScreen message=\"Redirecionando para o login...\" />;\n if (!hasPermission(permission)) {\n return <LoadingScreen message=\"Você não tem acesso a esta tela.\" />;\n }\n return <>{children}</>;\n}\n","import { Navigate } from \"react-router-dom\";\nimport { useActivation } from \"./ActivationProvider\";\nexport function ActivationGuard({ children }: { children: JSX.Element }) {\n const { status } = useActivation();\n if (status === \"loading\") return null;\n if (status === \"suspended\") return <Navigate to=\"/instancia-suspensa\" replace />;\n if (status === \"revoked\") return <Navigate to=\"/instancia-revogada\" replace />;\n if (status !== \"active\" && window.location.pathname !== \"/ativacao\") return <Navigate to=\"/ativacao\" replace />;\n return children;\n}\n","const PIPELINE_BOARD_STYLE_ID = \"oon-core-pipeline-board-natural-height\";\n\n/**\n * O quadro mantém a rolagem horizontal no fim do conteúdo e cresce conforme\n * a etapa com mais tickets. As setas continuam acessíveis durante a rolagem\n * vertical sem transformar o quadro em uma área de scroll própria.\n */\nexport const PIPELINE_BOARD_LAYOUT_CSS = `\n:where(*) > [data-oon-pipeline-board=\"true\"] {\n height: auto !important;\n min-height: 420px;\n overflow-y: visible !important;\n align-items: stretch !important;\n}\n\n:where(*) > [data-oon-pipeline-board=\"true\"] > * {\n align-self: stretch;\n}\n\n:where(*):has(> [data-oon-pipeline-board=\"true\"]) {\n display: grid;\n grid-template-areas: \"oon-pipeline-board\";\n align-items: start;\n}\n\n:where(*):has(> [data-oon-pipeline-board=\"true\"]) > [data-oon-pipeline-board=\"true\"] {\n grid-area: oon-pipeline-board;\n}\n\n:where(*):has(> [data-oon-pipeline-board=\"true\"]) > button[aria-label=\"Deslizar quadro para a esquerda\"],\n:where(*):has(> [data-oon-pipeline-board=\"true\"]) > button[aria-label=\"Deslizar quadro para a direita\"] {\n grid-area: oon-pipeline-board;\n position: sticky !important;\n top: calc(50vh - 17px) !important;\n right: auto !important;\n left: auto !important;\n align-self: start;\n transform: none !important;\n z-index: 3;\n}\n\n:where(*):has(> [data-oon-pipeline-board=\"true\"]) > button[aria-label=\"Deslizar quadro para a esquerda\"] {\n justify-self: start;\n margin-left: 8px;\n}\n\n:where(*):has(> [data-oon-pipeline-board=\"true\"]) > button[aria-label=\"Deslizar quadro para a direita\"] {\n justify-self: end;\n margin-right: 8px;\n}\n`;\n\nexport function installPipelineBoardLayoutStyles(targetDocument: Document = document) {\n if (targetDocument.getElementById(PIPELINE_BOARD_STYLE_ID)) return;\n\n const style = targetDocument.createElement(\"style\");\n style.id = PIPELINE_BOARD_STYLE_ID;\n style.textContent = PIPELINE_BOARD_LAYOUT_CSS;\n targetDocument.head.appendChild(style);\n}\n","import type { OonAppDefinition, OonCoreFrontConfig, OonMenuItem, OonModule, OonNavigationConfig } from \"../types\";\nimport { start } from \"../start\";\nimport { defineOonNavigation, defineOonRoutes } from \"../routing\";\n\nfunction navigationItems(navigation: OonAppDefinition[\"navigation\"]): OonMenuItem[] {\n if (!navigation) return [];\n return Array.isArray(navigation) ? navigation : navigation.items ?? [];\n}\n\nexport function defineOonApp<const T extends OonAppDefinition>(definition: T): T {\n if (!definition?.app?.id) throw new Error(\"defineOonApp: app.id é obrigatório.\");\n if (!definition?.app?.name) throw new Error(\"defineOonApp: app.name é obrigatório.\");\n if (!definition?.api?.baseUrl) throw new Error(\"defineOonApp: api.baseUrl é obrigatório.\");\n if (definition.security?.enableRouteGuard === false || definition.security?.enablePermissionGate === false) {\n throw new Error(\"defineOonApp: guards obrigatórios de rota e permissão não podem ser desabilitados.\");\n }\n defineOonRoutes(definition.routes ?? []);\n defineOonNavigation(navigationItems(definition.navigation));\n return definition;\n}\n\nexport function appDefinitionToConfig(definition: OonAppDefinition): OonCoreFrontConfig {\n const app = defineOonApp(definition);\n const localModule: OonModule = {\n id: \"app.local\",\n label: app.app.name,\n routes: [...(app.routes ?? [])],\n menu: navigationItems(app.navigation),\n };\n const modules = localModule.routes?.length || localModule.menu?.length\n ? [localModule, ...(app.modules ?? [])]\n : [...(app.modules ?? [])];\n const uiNavigation: OonNavigationConfig | undefined = Array.isArray(app.navigation)\n ? { mode: \"manual\", items: app.navigation }\n : app.navigation;\n\n return {\n app: app.app,\n api: app.api,\n runtimeMode: app.runtimeMode,\n auth: app.auth,\n theme: app.theme,\n themes: app.themes,\n defaultThemeId: app.defaultThemeId,\n modules,\n ui: app.ui || app.pages?.length\n ? {\n ...app.ui,\n schemaVersion: 2,\n views: app.ui?.views ?? [],\n navigation: app.ui?.navigation ?? uiNavigation,\n pages: [...(app.ui?.pages ?? []), ...(app.pages ?? [])],\n }\n : undefined,\n layout: app.shell ?? app.ui?.layout,\n registry: {\n ...app.components,\n layoutSlots: { ...app.components?.layoutSlots, ...app.layouts },\n },\n security: {\n enableRouteGuard: true,\n enablePermissionGate: true,\n redactAssistantContext: true,\n disableConsoleInProduction: true,\n ...app.security,\n },\n systemPages: app.systemPages,\n rootElementId: app.rootElementId,\n };\n}\n\nexport function startOonApp(definition: OonAppDefinition): OonCoreFrontConfig {\n const config = appDefinitionToConfig(definition);\n start(config);\n return config;\n}\n"],"mappings":"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","names":["value","useMemo","useEffect","useState","Box","Text","value","jsx","jsxs","useState","useEffect","Box","Text","useEffect","useRef","useState","Box","Button","Flex","Heading","Input","Text","VStack","useLocation","jsx","jsxs","useEffect","useState","Fragment","jsx","jsxs","useState","useEffect","jsx","jsx","value","Navigate","Box","Button","Flex","Text","Box","Flex","Text","useState","jsx","jsxs","value","useState","Box","Flex","Text","jsx","jsxs","Flex","Box","Text","Button","jsx","Box","Button","Flex","Heading","Text","VStack","useNavigate","jsx","jsxs","useNavigate","Flex","Box","VStack","Text","Heading","Button","useLocation","Fragment","jsx","useLocation","useState","Box","Button","Flex","Heading","Input","Text","VStack","Link","Navigate","useLocation","jsx","jsxs","value","useLocation","useState","Navigate","Flex","Box","VStack","Text","Heading","Input","Button","Link","useState","Box","Button","Flex","Heading","Input","Text","VStack","Navigate","jsx","jsxs","useState","Navigate","Flex","Box","VStack","Text","Heading","Input","Button","useEffect","useState","Box","Button","Heading","Input","Text","VStack","Fragment","jsx","jsxs","useState","useEffect","Box","Text","Input","Button","VStack","Heading","Fragment","jsx","Navigate","jsx","Navigate","jsx","Navigate","jsx","useMemo","storage","tenantStorage","http","router","jsx"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/ApiProvider.tsx","../src/api/coreClient.ts","../src/api/createRestClient.ts","../src/api/errorNormalizer.ts","../src/api/resourceClient.ts","../src/security/TenantProvider.tsx","../src/security/AuthProvider.tsx","../src/security/tokenStorage.ts","../src/security/ActivationProvider.tsx"],"sourcesContent":["import { createContext, useContext, useMemo, type ReactNode } from \"react\";\nimport type { AxiosInstance } from \"axios\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { ModelSummary } from \"../types\";\nimport { createCoreClient, type CoreClient } from \"./coreClient\";\nimport { createResourceClient, type ResourceClient } from \"./resourceClient\";\n\ninterface ApiContextValue {\n http: AxiosInstance;\n core: CoreClient;\n resource: <T = Record<string, unknown>>(basePath: string) => ResourceClient<T>;\n}\n\nconst ApiContext = createContext<ApiContextValue | null>(null);\n\nexport function ApiProvider({ http, children }: { http: AxiosInstance; children: ReactNode }) {\n const value = useMemo<ApiContextValue>(() => {\n const cache = new Map<string, ResourceClient>();\n return {\n http,\n core: createCoreClient(http),\n resource<T = Record<string, unknown>>(basePath: string) {\n let client = cache.get(basePath);\n if (!client) {\n client = createResourceClient(http, basePath);\n cache.set(basePath, client);\n }\n return client as ResourceClient<T>;\n },\n };\n }, [http]);\n\n return <ApiContext.Provider value={value}>{children}</ApiContext.Provider>;\n}\n\nexport function useOonApi(): ApiContextValue {\n const ctx = useContext(ApiContext);\n if (!ctx) throw new Error(\"useOonApi deve ser usado dentro de <ApiProvider> (oonCoreFront.start).\");\n return ctx;\n}\n\n/** Cliente de um recurso, memoizado pelo basePath. */\nexport function useOonResource<T = Record<string, unknown>>(basePath: string): ResourceClient<T> {\n const { resource } = useOonApi();\n return useMemo(() => resource<T>(basePath), [resource, basePath]);\n}\n\n/** Metadata completa do back (cache de 5 min). */\nexport function useCoreMetadata() {\n const { core } = useOonApi();\n return useQuery({\n queryKey: [\"oon\", \"core\", \"metadata\"],\n queryFn: () => core.metadata(),\n staleTime: 5 * 60 * 1000,\n });\n}\n\n/** Descrição de uma model específica — base do modo \"dynamic\". */\nexport function useModelSchema(name: string, enabled = true) {\n const { core } = useOonApi();\n return useQuery<ModelSummary>({\n queryKey: [\"oon\", \"core\", \"model\", name],\n queryFn: () => core.model(name),\n staleTime: 5 * 60 * 1000,\n enabled: enabled && !!name,\n });\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { CoreMetadata, ModelSummary } from \"../types\";\n\n/**\n * SDK do contrato /core/* (introspecção dirigida por metadata). É o que\n * permite o modo \"dynamic\" das coleções: o front monta grid/form/rotas a\n * partir do que o back descreve, sem código de UI por entidade.\n */\nexport interface CoreClient {\n metadata(): Promise<CoreMetadata>;\n models(): Promise<ModelSummary[]>;\n model(name: string): Promise<ModelSummary>;\n permissions(): Promise<Array<{ resource: string; action: string; roles: string[] }>>;\n menus(): Promise<CoreMetadata[\"menus\"]>;\n}\n\nexport function createCoreClient(http: AxiosInstance): CoreClient {\n return {\n async metadata() {\n const { data } = await http.get<CoreMetadata>(\"/core/metadata\");\n return data;\n },\n async models() {\n const { data } = await http.get<{ results: ModelSummary[] }>(\"/core/models\");\n return data.results;\n },\n async model(name) {\n const { data } = await http.get<ModelSummary>(`/core/models/${name}`);\n return data;\n },\n async permissions() {\n const { data } = await http.get<{ results: Array<{ resource: string; action: string; roles: string[] }> }>(\n \"/core/permissions\"\n );\n return data.results;\n },\n async menus() {\n const { data } = await http.get<{ results: CoreMetadata[\"menus\"] }>(\"/core/menus\");\n return data.results;\n },\n };\n}\n","import axios, { type AxiosInstance } from \"axios\";\nimport type { AuditContext, OonApiConfig, OonRuntimeMode } from \"../types\";\nimport { normalizeError } from \"./errorNormalizer\";\n\nexport interface RestClientDeps {\n api: OonApiConfig;\n /** Lê o token atual (Bearer). Retorna null se não autenticado. */\n getToken: () => string | null;\n /** Lê a seleção atual de tenant. O backend continua sendo a autoridade. */\n getTenantId?: () => string | null;\n /** Chamado uma vez ao receber 401 (logout + redirect). */\n onUnauthorized?: () => void;\n /** Origem app id, vai no header x-oon-app. */\n appId?: string;\n runtimeMode?: OonRuntimeMode;\n}\n\nfunction readCookie(name: string): string | null {\n try {\n const prefix = `${name}=`;\n const value = document.cookie\n .split(\";\")\n .map((item) => item.trim())\n .find((item) => item.startsWith(prefix));\n return value ? decodeURIComponent(value.slice(prefix.length)) : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Cliente REST único do Core (Seção 2.5). Centraliza:\n * - baseUrl + versionPrefix;\n * - injeção de Bearer token;\n * - seleção de tenant via x-oon-tenant-id;\n * - headers de auditoria x-oon-* nas mutações;\n * - tratamento global de 401 e normalização de erro.\n */\nexport function createRestClient(deps: RestClientDeps): AxiosInstance {\n const { api, getToken, getTenantId, onUnauthorized, appId, runtimeMode = \"platform\" } = deps;\n const prefix = api.versionPrefix ?? \"\";\n\n const instance = axios.create({\n baseURL: `${api.baseUrl.replace(/\\/$/, \"\")}${prefix}`,\n timeout: api.timeout ?? 30000,\n withCredentials: runtimeMode === \"local\",\n });\n\n instance.interceptors.request.use((config) => {\n const token = runtimeMode === \"local\" ? null : getToken();\n if (token && config.headers.Authorization !== false && !config.headers.Authorization) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n // A chamada pode selecionar um tenant específico mesmo quando o shell está\n // em modo global multi-tenant. Nesse caso, o header explícito tem precedência\n // sobre a seleção global e nunca deve ser removido pelo interceptor.\n const explicitTenantId = config.headers.get(\"x-oon-tenant-id\");\n // Axios usa false para suprimir um header nesta requisição. O handshake\n // de launch não pode herdar seleção de storage/defaults de outra sessão.\n const tenantId = explicitTenantId === false ? null : explicitTenantId || getTenantId?.();\n if (tenantId) config.headers.set(\"x-oon-tenant-id\", String(tenantId));\n else config.headers.delete(\"x-oon-tenant-id\");\n if (appId) config.headers[\"x-oon-app\"] = appId;\n if (\n runtimeMode === \"local\"\n && ![\"get\", \"head\", \"options\"].includes(String(config.method || \"get\").toLowerCase())\n ) {\n const csrf = readCookie(\"oon_local_csrf\");\n if (csrf) config.headers.set(\"x-oon-local-csrf\", csrf);\n }\n return config;\n });\n\n instance.interceptors.response.use(\n (res) => res,\n (error) => {\n const normalized = normalizeError(error);\n const requestPath = String(error.config?.url || \"\")\n .split(\"?\")[0]\n .replace(/\\/$/, \"\");\n const isLogin = requestPath.endsWith(\"/auth/autenticar\") || /\\/core\\/invitations\\/(?:accept|inspect|[^/]+\\/accept)$/.test(requestPath);\n if (normalized.status === 401 && !isLogin && !error.config?.signal?.aborted) onUnauthorized?.();\n return Promise.reject(normalized);\n }\n );\n\n return instance;\n}\n\n/** Monta os headers de auditoria x-oon-* a partir do contexto. */\nexport function auditHeaders(audit?: AuditContext): Record<string, string> {\n if (!audit) return {};\n const headers: Record<string, string> = {};\n if (audit.origem) headers[\"x-oon-origin\"] = audit.origem;\n if (audit.module) headers[\"x-oon-module\"] = audit.module;\n if (audit.entity) headers[\"x-oon-entity\"] = audit.entity;\n return headers;\n}\n\n\n","import axios from \"axios\";\nimport type { OonError } from \"../types\";\n\ntype ErrorEnvelope = {\n code?: string;\n message?: string;\n details?: unknown;\n requestId?: string;\n field?: string;\n technicalMessage?: string;\n [key: string]: unknown;\n};\n\ntype ErrorPayload = {\n code?: string;\n message?: string;\n details?: unknown;\n requestId?: string;\n error?: ErrorEnvelope | string;\n};\n\n/**\n * Normaliza qualquer erro de rede/axios para o formato `OonError`, lendo o\n * envelope de erro padrão do back (`{ message }` ou `{ error: {...} }`).\n */\nexport function normalizeError(err: unknown): OonError {\n if (axios.isAxiosError(err)) {\n const status = err.response?.status;\n const data = err.response?.data as string | ErrorPayload | undefined;\n const responseRequestId = (\n err.response?.headers?.[\"x-request-id\"]\n ?? err.response?.headers?.[\"x-correlation-id\"]\n ) as string | undefined;\n\n const contentType = String(err.response?.headers?.[\"content-type\"] || \"\");\n const isTextPayload = typeof data === \"string\";\n const isProbablyHtml = isTextPayload && /<html|<!doctype/i.test(data);\n\n if (isTextPayload || (contentType && !contentType.includes(\"json\"))) {\n return {\n code: codeFromStatus(status),\n message: nonJsonMessage(status, err.config?.url, isProbablyHtml),\n status,\n details: isProbablyHtml ? undefined : data,\n requestId: responseRequestId,\n };\n }\n\n const rawError = data?.error;\n const envelope = rawError && typeof rawError === \"object\" ? rawError : undefined;\n const legacyDetails = envelope && envelope.details === undefined && envelope.field\n ? envelope\n : undefined;\n const rawTechnicalDetails = typeof rawError === \"string\"\n ? { technicalMessage: rawError }\n : undefined;\n\n return {\n code: envelope?.code || data?.code || codeFromStatus(status),\n message: envelope?.message || data?.message || err.message || \"Erro inesperado.\",\n status,\n details: envelope?.details ?? legacyDetails ?? data?.details ?? rawTechnicalDetails,\n requestId: envelope?.requestId || data?.requestId || responseRequestId,\n };\n }\n\n if (err instanceof Error) {\n return { code: \"UNKNOWN\", message: err.message };\n }\n\n return { code: \"UNKNOWN\", message: \"Erro inesperado.\" };\n}\n\nfunction nonJsonMessage(status?: number, url?: string, html?: boolean): string {\n const path = url ? ` (${url})` : \"\";\n if (status === 404) {\n return `Rota da API não encontrada${path}. Verifique VITE_API_URL, porta do backend e modo da Central.`;\n }\n if (html) {\n return `Backend retornou HTML em vez de JSON${path}. Verifique se o frontend está apontando para a API correta.`;\n }\n return `Backend retornou resposta não JSON${path}. Verifique a configuração da API.`;\n}\n\nfunction codeFromStatus(status?: number): string {\n switch (status) {\n case 400:\n return \"VALIDATION_ERROR\";\n case 401:\n return \"UNAUTHORIZED\";\n case 403:\n return \"FORBIDDEN\";\n case 404:\n return \"NOT_FOUND\";\n case 409:\n return \"CONFLICT\";\n default:\n return status && status >= 500 ? \"SERVER_ERROR\" : \"REQUEST_ERROR\";\n }\n}\n","import type { AxiosInstance } from \"axios\";\nimport type { AuditContext, ListParams, PaginatedResult } from \"../types\";\nimport { auditHeaders } from \"./createRestClient\";\n\n/**\n * SDK por recurso (Seção 2.5). Espelha o CRUD gerado pelo back em `basePath`:\n * GET / -> list (paginado)\n * GET /:id -> get\n * POST / -> create\n * PUT /:id -> update\n * PATCH /:id -> patch\n * DELETE /:id -> delete\n * POST /import -> importMany\n * GET /export -> exportAll\n *\n * O back devolve registro único na chave do singular (`{ [singular]: {...} }`);\n * `unwrap` extrai o primeiro valor não-meta para o consumidor não precisar\n * conhecer o singular.\n */\nexport interface ResourceClient<T = Record<string, unknown>> {\n list(params?: ListParams): Promise<PaginatedResult<T>>;\n get(id: string): Promise<T>;\n create(body: Partial<T>, audit?: AuditContext): Promise<T>;\n update(id: string, body: Partial<T>, audit?: AuditContext): Promise<T>;\n patch(id: string, body: Partial<T>, audit?: AuditContext): Promise<T>;\n delete(id: string, audit?: AuditContext): Promise<T>;\n importMany(rows: unknown[], audit?: AuditContext): Promise<{ inserted?: number; [k: string]: unknown }>;\n exportAll(params?: ListParams): Promise<T[]>;\n}\n\nconst META_KEYS = new Set([\"pagination\", \"results\", \"message\", \"requestId\"]);\n\nfunction unwrap<T>(data: Record<string, unknown>): T {\n // resposta tipo { pessoa: {...} } — pega o primeiro valor de objeto.\n for (const [key, value] of Object.entries(data)) {\n if (!META_KEYS.has(key) && value && typeof value === \"object\") {\n return value as T;\n }\n }\n return data as T;\n}\n\nexport function createResourceClient<T = Record<string, unknown>>(\n http: AxiosInstance,\n basePath: string\n): ResourceClient<T> {\n const base = `/${basePath.replace(/^\\/+/, \"\")}`;\n\n return {\n async list(params) {\n const { data } = await http.get<PaginatedResult<T>>(base, { params });\n return data;\n },\n async get(id) {\n const { data } = await http.get<Record<string, unknown>>(`${base}/${id}`);\n return unwrap<T>(data);\n },\n async create(body, audit) {\n const { data } = await http.post<Record<string, unknown>>(base, body, {\n headers: auditHeaders(audit ?? { origem: \"form\" }),\n });\n return unwrap<T>(data);\n },\n async update(id, body, audit) {\n const { data } = await http.put<Record<string, unknown>>(`${base}/${id}`, body, {\n headers: auditHeaders(audit ?? { origem: \"form\" }),\n });\n return unwrap<T>(data);\n },\n async patch(id, body, audit) {\n const { data } = await http.patch<Record<string, unknown>>(`${base}/${id}`, body, {\n headers: auditHeaders(audit ?? { origem: \"datagrid\" }),\n });\n return unwrap<T>(data);\n },\n async delete(id, audit) {\n const { data } = await http.delete<Record<string, unknown>>(`${base}/${id}`, {\n headers: auditHeaders(audit ?? { origem: \"datagrid\" }),\n });\n return unwrap<T>(data);\n },\n async importMany(rows, audit) {\n const { data } = await http.post<{ inserted?: number }>(\n `${base}/import`,\n { rows },\n { headers: auditHeaders(audit ?? { origem: \"import\" }) }\n );\n return data;\n },\n async exportAll(params) {\n const { data } = await http.get<{ results: T[] } | T[]>(`${base}/export`, { params });\n return Array.isArray(data) ? data : data.results;\n },\n };\n}\n","import {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport type { AxiosInstance } from \"axios\";\nimport type { TenantStorage } from \"./tenantStorage\";\n\nexport interface OonTenantContextValue {\n activeTenantId: string | null;\n switchTenant(tenantId: string): void;\n clearTenant(): void;\n}\n\nconst TenantContext = createContext<OonTenantContextValue | null>(null);\n\nexport interface TenantProviderProps {\n http: AxiosInstance;\n storage: TenantStorage;\n children: ReactNode;\n}\n\nfunction applyHeader(http: AxiosInstance, tenantId: string | null) {\n if (tenantId) {\n http.defaults.headers.common[\"x-oon-tenant-id\"] = tenantId;\n return;\n }\n delete http.defaults.headers.common[\"x-oon-tenant-id\"];\n}\n\n/**\n * Gerencia somente a seleção ativa. O backend continua sendo a autoridade e\n * precisa validar o tenant antes de materializar req.accessContext.\n */\nexport function TenantProvider({ http, storage, children }: TenantProviderProps) {\n const queryClient = useQueryClient();\n const [activeTenantId, setActiveTenantId] = useState<string | null>(() => storage.get());\n const selectedTenant = useRef(activeTenantId);\n\n const replaceTenant = useCallback(\n (tenantId: string | null) => {\n const normalized = String(tenantId ?? \"\").trim() || null;\n if (normalized) storage.set(normalized);\n else storage.clear();\n applyHeader(http, normalized);\n setActiveTenantId(normalized);\n\n // Nunca reutilizar cache entre tenants. `clear()` remove queries inativas,\n // dados observados e mutations pendentes do contexto anterior.\n if (selectedTenant.current !== normalized) {\n selectedTenant.current = normalized;\n queryClient.clear();\n }\n },\n [http, queryClient, storage],\n );\n\n const switchTenant = useCallback((tenantId: string) => {\n if (!tenantId?.trim()) throw new Error(\"tenantId é obrigatório.\");\n replaceTenant(tenantId);\n }, [replaceTenant]);\n const clearTenant = useCallback(() => replaceTenant(null), [replaceTenant]);\n\n const value = useMemo<OonTenantContextValue>(\n () => ({ activeTenantId, switchTenant, clearTenant }),\n [activeTenantId, switchTenant, clearTenant],\n );\n\n return <TenantContext.Provider value={value}>{children}</TenantContext.Provider>;\n}\n\nexport function useOptionalOonTenant(): OonTenantContextValue | null {\n return useContext(TenantContext);\n}\n\nexport function useOonTenant(): OonTenantContextValue {\n const value = useOptionalOonTenant();\n if (!value) throw new Error(\"useOonTenant deve ser usado dentro de TenantProvider.\");\n return value;\n}\n\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport type { AxiosInstance } from \"axios\";\nimport type { OonAuthConfig, OonError, OonUser } from \"../types\";\nimport { captureTokenFromUrl, type TokenStorage } from \"./tokenStorage\";\nimport { useOptionalActivation } from \"./ActivationProvider\";\nimport { useOptionalOonTenant } from \"./TenantProvider\";\n\nexport type AuthStatus =\n | \"loading\"\n | \"authenticated\"\n | \"first-access\"\n | \"unauthenticated\"\n | \"forbidden\"\n | \"error\";\n\ninterface AuthContextValue {\n user: OonUser | null;\n roles: string[];\n capabilities: string[];\n permissions: string[];\n status: AuthStatus;\n isAuthenticated: boolean;\n hasPermission: (permission?: string | string[]) => boolean;\n login: (email: string, password: string, tenantId?: string) => Promise<void>;\n completeFirstAccess: (password: string) => Promise<void>;\n retry: () => Promise<void>;\n logout: () => void;\n clearSession: () => void;\n}\n\nconst AuthContext = createContext<AuthContextValue | null>(null);\n\nexport interface AuthProviderProps {\n http: AxiosInstance;\n storage: TokenStorage;\n auth?: OonAuthConfig;\n loginUrl?: string;\n runtimeMode?: \"platform\" | \"local\";\n children: ReactNode;\n}\n\nfunction errorStatus(error: unknown): number | undefined {\n return (error as OonError | undefined)?.status;\n}\n\nfunction encodeBasicCredentials(email: string, password: string): string {\n const bytes = new TextEncoder().encode(`${email}:${password}`);\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return window.btoa(binary);\n}\n\nfunction normalizeList(value: unknown): string[] {\n if (Array.isArray(value)) return value.map(String).filter(Boolean);\n if (typeof value === \"string\") return value.split(/[\\s,;]+/).map((item) => item.trim()).filter(Boolean);\n return [];\n}\n\nfunction unique(values: string[]): string[] {\n return values.filter((item, index, all) => Boolean(item) && all.indexOf(item) === index);\n}\n\nfunction extractCapabilities(user: OonUser | null): string[] {\n if (!user) return [];\n return unique([\n ...normalizeList(user.capabilities),\n ...normalizeList(user.permissoes?.capabilities),\n ...normalizeList(user.aplicativo?.capabilities),\n ...normalizeList(user.aplicativo?.permissoes?.capabilities),\n ]);\n}\n\nfunction explicitPermissions(user: OonUser | null): string[] | null {\n if (!user) return [];\n const value = (user as OonUser & { permissions?: string[] }).permissions;\n return Array.isArray(value) ? unique(value.map(String)) : null;\n}\n\nexport function can(\n user: OonUser | null,\n permission?: string | string[],\n): boolean {\n if (!permission) return true;\n const required = Array.isArray(permission) ? permission : [permission];\n if (!required.length) return true;\n\n const canonical = explicitPermissions(user);\n if (canonical) {\n return canonical.includes(\"*\") || required.some((value) => canonical.includes(value));\n }\n\n // Compatibilidade com backends anteriores ao RBAC canônico.\n const roles = unique(normalizeList((user as OonUser & { roleCode?: string })?.roleCode).concat(normalizeList(user?.tipo)));\n const capabilities = extractCapabilities(user);\n if (roles.includes(\"admin\") || roles.includes(\"master\")) return true;\n return required.some((value) => roles.includes(value) || capabilities.includes(value));\n}\n\nexport function AuthProvider({ http, storage, auth, loginUrl, runtimeMode = \"platform\", children }: AuthProviderProps) {\n const tokenParam = auth?.tokenParam ?? \"code\";\n const devToken = auth?.devToken?.trim() || null;\n const [user, setUser] = useState<OonUser | null>(null);\n const [status, setStatus] = useState<AuthStatus>(\"loading\");\n const activation = useOptionalActivation();\n const tenantContext = useOptionalOonTenant();\n const switchTenant = tenantContext?.switchTenant;\n const clearTenant = tenantContext?.clearTenant;\n // Compartilha o handshake entre reexecuções de effects (inclusive StrictMode).\n const launchAbort = useRef<AbortController | null>(null);\n const launchSession = useRef<Promise<{ token: string; user: OonUser }> | null>(null);\n\n const redirectToExternalLogin = useCallback(() => {\n if (runtimeMode === \"local\" || window.location.pathname === \"/accept-invite\") return;\n if (loginUrl) window.location.href = loginUrl;\n }, [loginUrl, runtimeMode]);\n\n const applyUser = useCallback((next: OonUser) => {\n setUser(next);\n const tenant = next.tenant as { id?: string } | undefined;\n const resolvedTenantId = String(next.tenantId || tenant?.id || \"\").trim();\n if (resolvedTenantId) switchTenant?.(resolvedTenantId);\n const firstAccess = Boolean(\n (next as OonUser & { mustChangePassword?: boolean; firstAccessPending?: boolean }).mustChangePassword ||\n (next as OonUser & { firstAccessPending?: boolean }).firstAccessPending,\n );\n setStatus(firstAccess ? \"first-access\" : \"authenticated\");\n }, [switchTenant]);\n\n const applyValidationError = useCallback(\n (error: unknown) => {\n const currentStatus = errorStatus(error);\n setUser(null);\n if (currentStatus === 403) {\n setStatus(\"forbidden\");\n return;\n }\n if (currentStatus === 401) {\n storage.clear();\n setStatus(\"unauthenticated\");\n redirectToExternalLogin();\n return;\n }\n setStatus(\"error\");\n },\n [storage, redirectToExternalLogin],\n );\n\n const validateSession = useCallback(async () => {\n const response = await http.get<{ usuario: OonUser }>(\"/auth/validar-token\");\n applyUser(response.data.usuario);\n }, [http, applyUser]);\n\n const retry = useCallback(async () => {\n setStatus(\"loading\");\n try {\n await validateSession();\n } catch (error) {\n applyValidationError(error);\n throw error;\n }\n }, [validateSession, applyValidationError]);\n\n const login = useCallback(\n async (email: string, password: string, tenantId?: string) => {\n if (runtimeMode === \"local\") {\n const error: OonError = {\n code: \"LOCAL_LOGIN_NOT_SUPPORTED\",\n message: \"O runtime local não utiliza conta da plataforma.\",\n status: 403,\n };\n throw error;\n }\n launchAbort.current?.abort();\n launchSession.current = null;\n setStatus(\"loading\");\n setUser(null);\n try {\n const normalizedTenantId = String(tenantId || \"\").trim();\n if (normalizedTenantId) switchTenant?.(normalizedTenantId);\n else clearTenant?.();\n const response = await http.post<{ token: string }>(\n \"/auth/autenticar\",\n {},\n {\n headers: {\n Authorization: `Basic ${encodeBasicCredentials(email, password)}`,\n ...(normalizedTenantId ? { \"x-oon-tenant-id\": normalizedTenantId } : {}),\n },\n },\n );\n if (!response.data.token) {\n const error: OonError = { code: \"AUTH_TOKEN_MISSING\", message: \"Token não retornado pelo backend.\", status: 502 };\n throw error;\n }\n storage.set(response.data.token);\n await validateSession();\n } catch (error) {\n if ((error as OonError | undefined)?.code === \"TENANT_SELECTION_REQUIRED\") {\n setStatus(\"unauthenticated\");\n } else {\n applyValidationError(error);\n }\n throw error;\n }\n },\n [http, storage, validateSession, applyValidationError, switchTenant, clearTenant, runtimeMode],\n );\n\n const completeFirstAccess = useCallback(async (password: string) => {\n await http.post(\"/auth/first-access/password\", { password });\n await validateSession();\n }, [http, validateSession]);\n\n const logout = useCallback((options?: { redirect?: boolean }) => {\n launchAbort.current?.abort();\n launchSession.current = null;\n storage.clear();\n clearTenant?.();\n setUser(null);\n setStatus(\"unauthenticated\");\n if (runtimeMode === \"local\") {\n void http.post(\"/auth/local/logout\").catch(() => undefined);\n return;\n }\n if (options?.redirect !== false) redirectToExternalLogin();\n }, [storage, redirectToExternalLogin, clearTenant, runtimeMode, http]);\n\n useEffect(() => {\n let active = true;\n if (activation && ![\"active\", \"error\"].includes(activation.status)) {\n setUser(null);\n setStatus(\"unauthenticated\");\n return;\n }\n if (runtimeMode === \"local\") {\n storage.clear();\n const bootstrapCode = captureTokenFromUrl(\"oon_local_bootstrap\");\n setStatus(\"loading\");\n const bootstrap = bootstrapCode\n ? http.post(\"/auth/local/bootstrap\", { code: bootstrapCode })\n : Promise.resolve();\n bootstrap\n .then(() => http.get<{ usuario: OonUser }>(\"/auth/validar-token\"))\n .then((response) => {\n if (!active) return;\n applyUser(response.data.usuario);\n })\n .catch((error) => {\n if (!active) return;\n applyValidationError(error);\n });\n return () => { active = false; };\n }\n // Invitation inspection validates identity without requiring its pending grant.\n // Keep the stored credential for that request; protected routes still validate\n // normally when the app is reloaded after acceptance.\n if (window.location.pathname === \"/accept-invite\") {\n setUser(null);\n setStatus(\"unauthenticated\");\n return;\n }\n const launchCode = captureTokenFromUrl(\"oon_launch\");\n const incoming = captureTokenFromUrl(tokenParam);\n const stored = storage.get();\n\n if (launchCode || launchSession.current) {\n setUser(null);\n setStatus(\"loading\");\n if (!launchSession.current) {\n storage.clear();\n clearTenant?.();\n const controller = new AbortController();\n launchAbort.current = controller;\n // O token só é persistido depois da validação pela Central. O header\n // false neutraliza também defaults e getters de tenant sem Provider.\n launchSession.current = http.post<{ token: string }>(\"/auth/launch/exchange\", { code: launchCode },\n { signal: controller.signal, headers: { \"x-oon-tenant-id\": false, Authorization: false } },\n ).then(async (response) => {\n if (controller.signal.aborted) throw new Error(\"Launch cancelado.\");\n const token = response.data.token;\n if (!token) {\n const error: OonError = {\n code: \"APP_LAUNCH_TOKEN_MISSING\",\n message: \"A troca de abertura não retornou uma sessão.\",\n status: 502,\n };\n throw error;\n }\n const validation = await http.get<{ usuario: OonUser }>(\"/auth/validar-token\", {\n signal: controller.signal,\n headers: { Authorization: `Bearer ${token}`, \"x-oon-tenant-id\": false },\n });\n return { token, user: validation.data.usuario };\n });\n }\n const pending = launchSession.current;\n pending.then(({ token, user: next }) => {\n if (!active || launchSession.current !== pending) return;\n storage.set(token);\n applyUser(next);\n launchSession.current = null;\n }).catch((error) => {\n if (!active || launchSession.current !== pending) return;\n launchSession.current = null;\n storage.clear();\n clearTenant?.();\n applyValidationError(error);\n });\n return () => { active = false; };\n }\n\n const token = incoming ?? devToken ?? stored;\n if (token && token !== stored) storage.set(token);\n if (!token) {\n setUser(null);\n setStatus(\"unauthenticated\");\n redirectToExternalLogin();\n return;\n }\n setStatus(\"loading\");\n http.get<{ usuario: OonUser }>(\"/auth/validar-token\")\n .then((response) => {\n if (!active) return;\n applyUser(response.data.usuario);\n })\n .catch((error) => {\n if (!active) return;\n applyValidationError(error);\n });\n return () => { active = false; };\n }, [http, storage, tokenParam, devToken, redirectToExternalLogin, applyValidationError, applyUser, clearTenant, activation?.status, runtimeMode]);\n\n const roleCode = String((user as OonUser & { roleCode?: string })?.roleCode || user?.tipo || \"\");\n const roles = roleCode ? [roleCode] : [];\n const capabilities = extractCapabilities(user);\n const permissions = explicitPermissions(user) ?? capabilities;\n const hasPermission = useCallback(\n (permission?: string | string[]) => can(user, permission),\n [user],\n );\n\n const value: AuthContextValue = {\n user,\n roles,\n capabilities,\n permissions,\n status,\n isAuthenticated: status === \"authenticated\" || status === \"first-access\",\n hasPermission,\n login,\n completeFirstAccess,\n retry,\n logout: () => logout(),\n clearSession: () => logout({ redirect: false }),\n };\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;\n}\n\nexport function useOonAuth(): AuthContextValue {\n const context = useContext(AuthContext);\n if (!context) throw new Error(\"useOonAuth deve ser usado dentro de <AuthProvider> (oonCoreFront.start).\");\n return context;\n}\n\n\n","/**\n * Armazenamento de token encapsulado (Seção 6.2). Toda leitura/escrita de\n * token passa por aqui — nada de `localStorage.getItem('token')` espalhado.\n * Tudo com try/catch para JSON/localStorage inválido não derrubar a tela.\n */\nconst STORAGE_KEY = \"oon.auth.token\";\n\nexport interface TokenStorage {\n get(): string | null;\n set(token: string): void;\n clear(): void;\n}\n\nexport function createTokenStorage(namespace?: string): TokenStorage {\n const key = namespace ? `${STORAGE_KEY}.${namespace}` : STORAGE_KEY;\n\n return {\n get() {\n try {\n return window.localStorage.getItem(key);\n } catch {\n return null;\n }\n },\n set(token: string) {\n try {\n window.localStorage.setItem(key, token);\n } catch {\n /* storage indisponível (modo privado) — ignora silenciosamente. */\n }\n },\n clear() {\n try {\n window.localStorage.removeItem(key);\n } catch {\n /* noop */\n }\n },\n };\n}\n\n/**\n * Lê o token vindo do SSO via query string (?code=...) e remove da URL para\n * não vazar em histórico/logs. Retorna o token capturado, se houver.\n */\nexport function captureTokenFromUrl(tokenParam = \"code\"): string | null {\n try {\n const url = new URL(window.location.href);\n const token = url.searchParams.get(tokenParam);\n if (!token) return null;\n url.searchParams.delete(tokenParam);\n window.history.replaceState({}, document.title, url.pathname + url.search + url.hash);\n return token;\n } catch {\n return null;\n }\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useState,\n type ReactNode,\n} from \"react\";\nimport type { AxiosInstance } from \"axios\";\n\nexport type InstanceStatus =\n | \"loading\"\n | \"notActivated\"\n | \"validatingCode\"\n | \"codeValidated\"\n | \"submitting\"\n | \"configuring\"\n | \"active\"\n | \"suspended\"\n | \"revoked\"\n | \"error\";\n\nexport interface ActivationStatusResponse {\n role: \"root\" | \"member\";\n status: string;\n appCode: string;\n ambiente: string;\n podeAtivar: boolean;\n podeTentarNovamente: boolean;\n motivoSuspensao?: string;\n motivoRevogacao?: string;\n runtimeMode?: \"platform\" | \"local\";\n disconnected?: boolean;\n expiresAt?: string;\n}\n\ninterface ActivationContextValue {\n status: InstanceStatus;\n details: ActivationStatusResponse | null;\n refresh: () => Promise<void>;\n}\n\nconst ActivationContext = createContext<ActivationContextValue | null>(null);\n\nfunction mapStatus(data: ActivationStatusResponse): InstanceStatus {\n if ([\"ativa\", \"ativa_local\"].includes(data.status)) return \"active\";\n if (data.status === \"suspensa\") return \"suspended\";\n if (data.status === \"revogada\") return \"revoked\";\n if (data.status === \"configurando\") return \"configuring\";\n if (data.status === \"erro\" && !data.podeAtivar) return \"error\";\n return \"notActivated\";\n}\n\nexport function ActivationProvider({\n http,\n children,\n}: {\n http: AxiosInstance;\n children: ReactNode;\n}) {\n const [status, setStatus] = useState<InstanceStatus>(\"loading\");\n const [details, setDetails] = useState<ActivationStatusResponse | null>(null);\n\n const refresh = useCallback(async () => {\n setStatus(\"loading\");\n try {\n const response =\n await http.get<ActivationStatusResponse>(\"/ativacao/status\");\n setDetails(response.data);\n setStatus(mapStatus(response.data));\n } catch {\n setStatus(\"error\");\n }\n }, [http]);\n\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n return (\n <ActivationContext.Provider value={{ status, details, refresh }}>\n {children}\n </ActivationContext.Provider>\n );\n}\n\nexport function useOptionalActivation() {\n return useContext(ActivationContext);\n}\n\nexport function useActivation() {\n const context = useOptionalActivation();\n if (!context) {\n throw new Error(\n \"useActivation deve ser usado dentro de <ActivationProvider>.\",\n );\n }\n return context;\n}\n"],"mappings":";AAAA,SAAS,eAAe,YAAY,eAA+B;AAEnE,SAAS,gBAAgB;;;ACclB,SAAS,iBAAiB,MAAiC;AAChE,SAAO;AAAA,IACL,MAAM,WAAW;AACf,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAkB,gBAAgB;AAC9D,aAAO;AAAA,IACT;AAAA,IACA,MAAM,SAAS;AACb,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAiC,cAAc;AAC3E,aAAO,KAAK;AAAA,IACd;AAAA,IACA,MAAM,MAAM,MAAM;AAChB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAkB,gBAAgB,IAAI,EAAE;AACpE,aAAO;AAAA,IACT;AAAA,IACA,MAAM,cAAc;AAClB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAAA,QAC1B;AAAA,MACF;AACA,aAAO,KAAK;AAAA,IACd;AAAA,IACA,MAAM,QAAQ;AACZ,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAwC,aAAa;AACjF,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;;;ACzCA,OAAOA,YAAmC;;;ACA1C,OAAO,WAAW;AAyBX,SAAS,eAAe,KAAwB;AACrD,MAAI,MAAM,aAAa,GAAG,GAAG;AAC3B,UAAM,SAAS,IAAI,UAAU;AAC7B,UAAM,OAAO,IAAI,UAAU;AAC3B,UAAM,oBACJ,IAAI,UAAU,UAAU,cAAc,KACnC,IAAI,UAAU,UAAU,kBAAkB;AAG/C,UAAM,cAAc,OAAO,IAAI,UAAU,UAAU,cAAc,KAAK,EAAE;AACxE,UAAM,gBAAgB,OAAO,SAAS;AACtC,UAAM,iBAAiB,iBAAiB,mBAAmB,KAAK,IAAI;AAEpE,QAAI,iBAAkB,eAAe,CAAC,YAAY,SAAS,MAAM,GAAI;AACnE,aAAO;AAAA,QACL,MAAM,eAAe,MAAM;AAAA,QAC3B,SAAS,eAAe,QAAQ,IAAI,QAAQ,KAAK,cAAc;AAAA,QAC/D;AAAA,QACA,SAAS,iBAAiB,SAAY;AAAA,QACtC,WAAW;AAAA,MACb;AAAA,IACF;AAEA,UAAM,WAAW,MAAM;AACvB,UAAM,WAAW,YAAY,OAAO,aAAa,WAAW,WAAW;AACvE,UAAM,gBAAgB,YAAY,SAAS,YAAY,UAAa,SAAS,QACzE,WACA;AACJ,UAAM,sBAAsB,OAAO,aAAa,WAC5C,EAAE,kBAAkB,SAAS,IAC7B;AAEJ,WAAO;AAAA,MACL,MAAM,UAAU,QAAQ,MAAM,QAAQ,eAAe,MAAM;AAAA,MAC3D,SAAS,UAAU,WAAW,MAAM,WAAW,IAAI,WAAW;AAAA,MAC9D;AAAA,MACA,SAAS,UAAU,WAAW,iBAAiB,MAAM,WAAW;AAAA,MAChE,WAAW,UAAU,aAAa,MAAM,aAAa;AAAA,IACvD;AAAA,EACF;AAEA,MAAI,eAAe,OAAO;AACxB,WAAO,EAAE,MAAM,WAAW,SAAS,IAAI,QAAQ;AAAA,EACjD;AAEA,SAAO,EAAE,MAAM,WAAW,SAAS,mBAAmB;AACxD;AAEA,SAAS,eAAe,QAAiB,KAAc,MAAwB;AAC7E,QAAM,OAAO,MAAM,KAAK,GAAG,MAAM;AACjC,MAAI,WAAW,KAAK;AAClB,WAAO,gCAA6B,IAAI;AAAA,EAC1C;AACA,MAAI,MAAM;AACR,WAAO,uCAAuC,IAAI;AAAA,EACpD;AACA,SAAO,wCAAqC,IAAI;AAClD;AAEA,SAAS,eAAe,QAAyB;AAC/C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,UAAU,UAAU,MAAM,iBAAiB;AAAA,EACtD;AACF;;;ADlFA,SAAS,WAAW,MAA6B;AAC/C,MAAI;AACF,UAAM,SAAS,GAAG,IAAI;AACtB,UAAM,QAAQ,SAAS,OACpB,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,KAAK,CAAC,SAAS,KAAK,WAAW,MAAM,CAAC;AACzC,WAAO,QAAQ,mBAAmB,MAAM,MAAM,OAAO,MAAM,CAAC,IAAI;AAAA,EAClE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAUO,SAAS,iBAAiB,MAAqC;AACpE,QAAM,EAAE,KAAK,UAAU,aAAa,gBAAgB,OAAO,cAAc,WAAW,IAAI;AACxF,QAAM,SAAS,IAAI,iBAAiB;AAEpC,QAAM,WAAWC,OAAM,OAAO;AAAA,IAC5B,SAAS,GAAG,IAAI,QAAQ,QAAQ,OAAO,EAAE,CAAC,GAAG,MAAM;AAAA,IACnD,SAAS,IAAI,WAAW;AAAA,IACxB,iBAAiB,gBAAgB;AAAA,EACnC,CAAC;AAED,WAAS,aAAa,QAAQ,IAAI,CAAC,WAAW;AAC5C,UAAM,QAAQ,gBAAgB,UAAU,OAAO,SAAS;AACxD,QAAI,SAAS,OAAO,QAAQ,kBAAkB,SAAS,CAAC,OAAO,QAAQ,eAAe;AACpF,aAAO,QAAQ,gBAAgB,UAAU,KAAK;AAAA,IAChD;AAIA,UAAM,mBAAmB,OAAO,QAAQ,IAAI,iBAAiB;AAG7D,UAAM,WAAW,qBAAqB,QAAQ,OAAO,oBAAoB,cAAc;AACvF,QAAI,SAAU,QAAO,QAAQ,IAAI,mBAAmB,OAAO,QAAQ,CAAC;AAAA,QAC/D,QAAO,QAAQ,OAAO,iBAAiB;AAC5C,QAAI,MAAO,QAAO,QAAQ,WAAW,IAAI;AACzC,QACE,gBAAgB,WACb,CAAC,CAAC,OAAO,QAAQ,SAAS,EAAE,SAAS,OAAO,OAAO,UAAU,KAAK,EAAE,YAAY,CAAC,GACpF;AACA,YAAM,OAAO,WAAW,gBAAgB;AACxC,UAAI,KAAM,QAAO,QAAQ,IAAI,oBAAoB,IAAI;AAAA,IACvD;AACA,WAAO;AAAA,EACT,CAAC;AAED,WAAS,aAAa,SAAS;AAAA,IAC7B,CAAC,QAAQ;AAAA,IACT,CAAC,UAAU;AACT,YAAM,aAAa,eAAe,KAAK;AACvC,YAAM,cAAc,OAAO,MAAM,QAAQ,OAAO,EAAE,EAC/C,MAAM,GAAG,EAAE,CAAC,EACZ,QAAQ,OAAO,EAAE;AACpB,YAAM,UAAU,YAAY,SAAS,kBAAkB,KAAK,yDAAyD,KAAK,WAAW;AACrI,UAAI,WAAW,WAAW,OAAO,CAAC,WAAW,CAAC,MAAM,QAAQ,QAAQ,QAAS,kBAAiB;AAC9F,aAAO,QAAQ,OAAO,UAAU;AAAA,IAClC;AAAA,EACF;AAEA,SAAO;AACT;AAGO,SAAS,aAAa,OAA8C;AACzE,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,UAAkC,CAAC;AACzC,MAAI,MAAM,OAAQ,SAAQ,cAAc,IAAI,MAAM;AAClD,MAAI,MAAM,OAAQ,SAAQ,cAAc,IAAI,MAAM;AAClD,MAAI,MAAM,OAAQ,SAAQ,cAAc,IAAI,MAAM;AAClD,SAAO;AACT;;;AEnEA,IAAM,YAAY,oBAAI,IAAI,CAAC,cAAc,WAAW,WAAW,WAAW,CAAC;AAE3E,SAAS,OAAU,MAAkC;AAEnD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,CAAC,UAAU,IAAI,GAAG,KAAK,SAAS,OAAO,UAAU,UAAU;AAC7D,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,qBACd,MACA,UACmB;AACnB,QAAM,OAAO,IAAI,SAAS,QAAQ,QAAQ,EAAE,CAAC;AAE7C,SAAO;AAAA,IACL,MAAM,KAAK,QAAQ;AACjB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAAwB,MAAM,EAAE,OAAO,CAAC;AACpE,aAAO;AAAA,IACT;AAAA,IACA,MAAM,IAAI,IAAI;AACZ,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAA6B,GAAG,IAAI,IAAI,EAAE,EAAE;AACxE,aAAO,OAAU,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,OAAO,MAAM,OAAO;AACxB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,KAA8B,MAAM,MAAM;AAAA,QACpE,SAAS,aAAa,SAAS,EAAE,QAAQ,OAAO,CAAC;AAAA,MACnD,CAAC;AACD,aAAO,OAAU,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,OAAO,IAAI,MAAM,OAAO;AAC5B,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAA6B,GAAG,IAAI,IAAI,EAAE,IAAI,MAAM;AAAA,QAC9E,SAAS,aAAa,SAAS,EAAE,QAAQ,OAAO,CAAC;AAAA,MACnD,CAAC;AACD,aAAO,OAAU,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,MAAM,IAAI,MAAM,OAAO;AAC3B,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,MAA+B,GAAG,IAAI,IAAI,EAAE,IAAI,MAAM;AAAA,QAChF,SAAS,aAAa,SAAS,EAAE,QAAQ,WAAW,CAAC;AAAA,MACvD,CAAC;AACD,aAAO,OAAU,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,OAAO,IAAI,OAAO;AACtB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,OAAgC,GAAG,IAAI,IAAI,EAAE,IAAI;AAAA,QAC3E,SAAS,aAAa,SAAS,EAAE,QAAQ,WAAW,CAAC;AAAA,MACvD,CAAC;AACD,aAAO,OAAU,IAAI;AAAA,IACvB;AAAA,IACA,MAAM,WAAW,MAAM,OAAO;AAC5B,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK;AAAA,QAC1B,GAAG,IAAI;AAAA,QACP,EAAE,KAAK;AAAA,QACP,EAAE,SAAS,aAAa,SAAS,EAAE,QAAQ,SAAS,CAAC,EAAE;AAAA,MACzD;AACA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,UAAU,QAAQ;AACtB,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,IAA4B,GAAG,IAAI,WAAW,EAAE,OAAO,CAAC;AACpF,aAAO,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAK;AAAA,IAC3C;AAAA,EACF;AACF;;;AJ9DS;AAnBT,IAAM,aAAa,cAAsC,IAAI;AAEtD,SAAS,YAAY,EAAE,MAAM,SAAS,GAAiD;AAC5F,QAAM,QAAQ,QAAyB,MAAM;AAC3C,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,WAAO;AAAA,MACL;AAAA,MACA,MAAM,iBAAiB,IAAI;AAAA,MAC3B,SAAsC,UAAkB;AACtD,YAAI,SAAS,MAAM,IAAI,QAAQ;AAC/B,YAAI,CAAC,QAAQ;AACX,mBAAS,qBAAqB,MAAM,QAAQ;AAC5C,gBAAM,IAAI,UAAU,MAAM;AAAA,QAC5B;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,SAAO,oBAAC,WAAW,UAAX,EAAoB,OAAe,UAAS;AACtD;AAEO,SAAS,YAA6B;AAC3C,QAAM,MAAM,WAAW,UAAU;AACjC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,wEAAwE;AAClG,SAAO;AACT;AAGO,SAAS,eAA4C,UAAqC;AAC/F,QAAM,EAAE,SAAS,IAAI,UAAU;AAC/B,SAAO,QAAQ,MAAM,SAAY,QAAQ,GAAG,CAAC,UAAU,QAAQ,CAAC;AAClE;AAGO,SAAS,kBAAkB;AAChC,QAAM,EAAE,KAAK,IAAI,UAAU;AAC3B,SAAO,SAAS;AAAA,IACd,UAAU,CAAC,OAAO,QAAQ,UAAU;AAAA,IACpC,SAAS,MAAM,KAAK,SAAS;AAAA,IAC7B,WAAW,IAAI,KAAK;AAAA,EACtB,CAAC;AACH;AAGO,SAAS,eAAe,MAAc,UAAU,MAAM;AAC3D,QAAM,EAAE,KAAK,IAAI,UAAU;AAC3B,SAAO,SAAuB;AAAA,IAC5B,UAAU,CAAC,OAAO,QAAQ,SAAS,IAAI;AAAA,IACvC,SAAS,MAAM,KAAK,MAAM,IAAI;AAAA,IAC9B,WAAW,IAAI,KAAK;AAAA,IACpB,SAAS,WAAW,CAAC,CAAC;AAAA,EACxB,CAAC;AACH;;;AKlEA;AAAA,EACE,iBAAAC;AAAA,EAEA;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,sBAAsB;AAgEtB,gBAAAC,YAAA;AAtDT,IAAM,gBAAgBH,eAA4C,IAAI;AAQtE,SAAS,YAAY,MAAqB,UAAyB;AACjE,MAAI,UAAU;AACZ,SAAK,SAAS,QAAQ,OAAO,iBAAiB,IAAI;AAClD;AAAA,EACF;AACA,SAAO,KAAK,SAAS,QAAQ,OAAO,iBAAiB;AACvD;AAMO,SAAS,eAAe,EAAE,MAAM,SAAS,SAAS,GAAwB;AAC/E,QAAM,cAAc,eAAe;AACnC,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAwB,MAAM,QAAQ,IAAI,CAAC;AACvF,QAAM,iBAAiB,OAAO,cAAc;AAE5C,QAAM,gBAAgB;AAAA,IACpB,CAAC,aAA4B;AAC3B,YAAM,aAAa,OAAO,YAAY,EAAE,EAAE,KAAK,KAAK;AACpD,UAAI,WAAY,SAAQ,IAAI,UAAU;AAAA,UACjC,SAAQ,MAAM;AACnB,kBAAY,MAAM,UAAU;AAC5B,wBAAkB,UAAU;AAI5B,UAAI,eAAe,YAAY,YAAY;AACzC,uBAAe,UAAU;AACzB,oBAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,IACA,CAAC,MAAM,aAAa,OAAO;AAAA,EAC7B;AAEA,QAAM,eAAe,YAAY,CAAC,aAAqB;AACrD,QAAI,CAAC,UAAU,KAAK,EAAG,OAAM,IAAI,MAAM,+BAAyB;AAChE,kBAAc,QAAQ;AAAA,EACxB,GAAG,CAAC,aAAa,CAAC;AAClB,QAAM,cAAc,YAAY,MAAM,cAAc,IAAI,GAAG,CAAC,aAAa,CAAC;AAE1E,QAAM,QAAQE;AAAA,IACZ,OAAO,EAAE,gBAAgB,cAAc,YAAY;AAAA,IACnD,CAAC,gBAAgB,cAAc,WAAW;AAAA,EAC5C;AAEA,SAAO,gBAAAC,KAAC,cAAc,UAAd,EAAuB,OAAe,UAAS;AACzD;AAEO,SAAS,uBAAqD;AACnE,SAAOF,YAAW,aAAa;AACjC;AAEO,SAAS,eAAsC;AACpD,QAAM,QAAQ,qBAAqB;AACnC,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,uDAAuD;AACnF,SAAO;AACT;;;ACpFA;AAAA,EACE,iBAAAG;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OAEK;;;ACHP,IAAM,cAAc;AAQb,SAAS,mBAAmB,WAAkC;AACnE,QAAM,MAAM,YAAY,GAAG,WAAW,IAAI,SAAS,KAAK;AAExD,SAAO;AAAA,IACL,MAAM;AACJ,UAAI;AACF,eAAO,OAAO,aAAa,QAAQ,GAAG;AAAA,MACxC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,IAAI,OAAe;AACjB,UAAI;AACF,eAAO,aAAa,QAAQ,KAAK,KAAK;AAAA,MACxC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,IACA,QAAQ;AACN,UAAI;AACF,eAAO,aAAa,WAAW,GAAG;AAAA,MACpC,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,oBAAoB,aAAa,QAAuB;AACtE,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,UAAM,QAAQ,IAAI,aAAa,IAAI,UAAU;AAC7C,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,aAAa,OAAO,UAAU;AAClC,WAAO,QAAQ,aAAa,CAAC,GAAG,SAAS,OAAO,IAAI,WAAW,IAAI,SAAS,IAAI,IAAI;AACpF,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACxDA;AAAA,EACE,iBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA,YAAAC;AAAA,OAEK;AAyEH,gBAAAC,YAAA;AAtCJ,IAAM,oBAAoBJ,eAA6C,IAAI;AAE3E,SAAS,UAAU,MAAgD;AACjE,MAAI,CAAC,SAAS,aAAa,EAAE,SAAS,KAAK,MAAM,EAAG,QAAO;AAC3D,MAAI,KAAK,WAAW,WAAY,QAAO;AACvC,MAAI,KAAK,WAAW,WAAY,QAAO;AACvC,MAAI,KAAK,WAAW,eAAgB,QAAO;AAC3C,MAAI,KAAK,WAAW,UAAU,CAAC,KAAK,WAAY,QAAO;AACvD,SAAO;AACT;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,QAAQ,SAAS,IAAIG,UAAyB,SAAS;AAC9D,QAAM,CAAC,SAAS,UAAU,IAAIA,UAA0C,IAAI;AAE5E,QAAM,UAAUF,aAAY,YAAY;AACtC,cAAU,SAAS;AACnB,QAAI;AACF,YAAM,WACJ,MAAM,KAAK,IAA8B,kBAAkB;AAC7D,iBAAW,SAAS,IAAI;AACxB,gBAAU,UAAU,SAAS,IAAI,CAAC;AAAA,IACpC,QAAQ;AACN,gBAAU,OAAO;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,YAAU,MAAM;AACd,SAAK,QAAQ;AAAA,EACf,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE,gBAAAG,KAAC,kBAAkB,UAAlB,EAA2B,OAAO,EAAE,QAAQ,SAAS,QAAQ,GAC3D,UACH;AAEJ;AAEO,SAAS,wBAAwB;AACtC,SAAOF,YAAW,iBAAiB;AACrC;AAEO,SAAS,gBAAgB;AAC9B,QAAM,UAAU,sBAAsB;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AF0QS,gBAAAG,YAAA;AAtUT,IAAM,cAAcC,eAAuC,IAAI;AAW/D,SAAS,YAAY,OAAoC;AACvD,SAAQ,OAAgC;AAC1C;AAEA,SAAS,uBAAuB,OAAe,UAA0B;AACvE,QAAM,QAAQ,IAAI,YAAY,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,EAAE;AAC7D,MAAI,SAAS;AACb,aAAW,QAAQ,MAAO,WAAU,OAAO,aAAa,IAAI;AAC5D,SAAO,OAAO,KAAK,MAAM;AAC3B;AAEA,SAAS,cAAc,OAA0B;AAC/C,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,MAAM,EAAE,OAAO,OAAO;AACjE,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,MAAM,SAAS,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AACtG,SAAO,CAAC;AACV;AAEA,SAAS,OAAO,QAA4B;AAC1C,SAAO,OAAO,OAAO,CAAC,MAAM,OAAO,QAAQ,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI,MAAM,KAAK;AACzF;AAEA,SAAS,oBAAoB,MAAgC;AAC3D,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,SAAO,OAAO;AAAA,IACZ,GAAG,cAAc,KAAK,YAAY;AAAA,IAClC,GAAG,cAAc,KAAK,YAAY,YAAY;AAAA,IAC9C,GAAG,cAAc,KAAK,YAAY,YAAY;AAAA,IAC9C,GAAG,cAAc,KAAK,YAAY,YAAY,YAAY;AAAA,EAC5D,CAAC;AACH;AAEA,SAAS,oBAAoB,MAAuC;AAClE,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAM,QAAS,KAA8C;AAC7D,SAAO,MAAM,QAAQ,KAAK,IAAI,OAAO,MAAM,IAAI,MAAM,CAAC,IAAI;AAC5D;AAEO,SAAS,IACd,MACA,YACS;AACT,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,WAAW,MAAM,QAAQ,UAAU,IAAI,aAAa,CAAC,UAAU;AACrE,MAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,QAAM,YAAY,oBAAoB,IAAI;AAC1C,MAAI,WAAW;AACb,WAAO,UAAU,SAAS,GAAG,KAAK,SAAS,KAAK,CAAC,UAAU,UAAU,SAAS,KAAK,CAAC;AAAA,EACtF;AAGA,QAAM,QAAQ,OAAO,cAAe,MAA0C,QAAQ,EAAE,OAAO,cAAc,MAAM,IAAI,CAAC,CAAC;AACzH,QAAM,eAAe,oBAAoB,IAAI;AAC7C,MAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,QAAQ,EAAG,QAAO;AAChE,SAAO,SAAS,KAAK,CAAC,UAAU,MAAM,SAAS,KAAK,KAAK,aAAa,SAAS,KAAK,CAAC;AACvF;AAEO,SAAS,aAAa,EAAE,MAAM,SAAS,MAAM,UAAU,cAAc,YAAY,SAAS,GAAsB;AACrH,QAAM,aAAa,MAAM,cAAc;AACvC,QAAM,WAAW,MAAM,UAAU,KAAK,KAAK;AAC3C,QAAM,CAAC,MAAM,OAAO,IAAIC,UAAyB,IAAI;AACrD,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAqB,SAAS;AAC1D,QAAM,aAAa,sBAAsB;AACzC,QAAM,gBAAgB,qBAAqB;AAC3C,QAAM,eAAe,eAAe;AACpC,QAAM,cAAc,eAAe;AAEnC,QAAM,cAAcC,QAA+B,IAAI;AACvD,QAAM,gBAAgBA,QAAyD,IAAI;AAEnF,QAAM,0BAA0BC,aAAY,MAAM;AAChD,QAAI,gBAAgB,WAAW,OAAO,SAAS,aAAa,iBAAkB;AAC9E,QAAI,SAAU,QAAO,SAAS,OAAO;AAAA,EACvC,GAAG,CAAC,UAAU,WAAW,CAAC;AAE1B,QAAM,YAAYA,aAAY,CAAC,SAAkB;AAC/C,YAAQ,IAAI;AACZ,UAAM,SAAS,KAAK;AACpB,UAAM,mBAAmB,OAAO,KAAK,YAAY,QAAQ,MAAM,EAAE,EAAE,KAAK;AACxE,QAAI,iBAAkB,gBAAe,gBAAgB;AACrD,UAAM,cAAc;AAAA,MACjB,KAAkF,sBAClF,KAAoD;AAAA,IACvD;AACA,cAAU,cAAc,iBAAiB,eAAe;AAAA,EAC1D,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,uBAAuBA;AAAA,IAC3B,CAAC,UAAmB;AAClB,YAAM,gBAAgB,YAAY,KAAK;AACvC,cAAQ,IAAI;AACZ,UAAI,kBAAkB,KAAK;AACzB,kBAAU,WAAW;AACrB;AAAA,MACF;AACA,UAAI,kBAAkB,KAAK;AACzB,gBAAQ,MAAM;AACd,kBAAU,iBAAiB;AAC3B,gCAAwB;AACxB;AAAA,MACF;AACA,gBAAU,OAAO;AAAA,IACnB;AAAA,IACA,CAAC,SAAS,uBAAuB;AAAA,EACnC;AAEA,QAAM,kBAAkBA,aAAY,YAAY;AAC9C,UAAM,WAAW,MAAM,KAAK,IAA0B,qBAAqB;AAC3E,cAAU,SAAS,KAAK,OAAO;AAAA,EACjC,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,QAAM,QAAQA,aAAY,YAAY;AACpC,cAAU,SAAS;AACnB,QAAI;AACF,YAAM,gBAAgB;AAAA,IACxB,SAAS,OAAO;AACd,2BAAqB,KAAK;AAC1B,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,iBAAiB,oBAAoB,CAAC;AAE1C,QAAM,QAAQA;AAAA,IACZ,OAAO,OAAe,UAAkB,aAAsB;AAC5D,UAAI,gBAAgB,SAAS;AAC3B,cAAM,QAAkB;AAAA,UACtB,MAAM;AAAA,UACN,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AACA,cAAM;AAAA,MACR;AACA,kBAAY,SAAS,MAAM;AAC3B,oBAAc,UAAU;AACxB,gBAAU,SAAS;AACnB,cAAQ,IAAI;AACZ,UAAI;AACF,cAAM,qBAAqB,OAAO,YAAY,EAAE,EAAE,KAAK;AACvD,YAAI,mBAAoB,gBAAe,kBAAkB;AAAA,YACpD,eAAc;AACnB,cAAM,WAAW,MAAM,KAAK;AAAA,UAC1B;AAAA,UACA,CAAC;AAAA,UACD;AAAA,YACE,SAAS;AAAA,cACP,eAAe,SAAS,uBAAuB,OAAO,QAAQ,CAAC;AAAA,cAC/D,GAAI,qBAAqB,EAAE,mBAAmB,mBAAmB,IAAI,CAAC;AAAA,YACxE;AAAA,UACF;AAAA,QACF;AACA,YAAI,CAAC,SAAS,KAAK,OAAO;AACxB,gBAAM,QAAkB,EAAE,MAAM,sBAAsB,SAAS,wCAAqC,QAAQ,IAAI;AAChH,gBAAM;AAAA,QACR;AACA,gBAAQ,IAAI,SAAS,KAAK,KAAK;AAC/B,cAAM,gBAAgB;AAAA,MACxB,SAAS,OAAO;AACd,YAAK,OAAgC,SAAS,6BAA6B;AACzE,oBAAU,iBAAiB;AAAA,QAC7B,OAAO;AACL,+BAAqB,KAAK;AAAA,QAC5B;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,MAAM,SAAS,iBAAiB,sBAAsB,cAAc,aAAa,WAAW;AAAA,EAC/F;AAEA,QAAM,sBAAsBA,aAAY,OAAO,aAAqB;AAClE,UAAM,KAAK,KAAK,+BAA+B,EAAE,SAAS,CAAC;AAC3D,UAAM,gBAAgB;AAAA,EACxB,GAAG,CAAC,MAAM,eAAe,CAAC;AAE1B,QAAM,SAASA,aAAY,CAAC,YAAqC;AAC/D,gBAAY,SAAS,MAAM;AAC3B,kBAAc,UAAU;AACxB,YAAQ,MAAM;AACd,kBAAc;AACd,YAAQ,IAAI;AACZ,cAAU,iBAAiB;AAC3B,QAAI,gBAAgB,SAAS;AAC3B,WAAK,KAAK,KAAK,oBAAoB,EAAE,MAAM,MAAM,MAAS;AAC1D;AAAA,IACF;AACA,QAAI,SAAS,aAAa,MAAO,yBAAwB;AAAA,EAC3D,GAAG,CAAC,SAAS,yBAAyB,aAAa,aAAa,IAAI,CAAC;AAErE,EAAAC,WAAU,MAAM;AACd,QAAI,SAAS;AACb,QAAI,cAAc,CAAC,CAAC,UAAU,OAAO,EAAE,SAAS,WAAW,MAAM,GAAG;AAClE,cAAQ,IAAI;AACZ,gBAAU,iBAAiB;AAC3B;AAAA,IACF;AACA,QAAI,gBAAgB,SAAS;AAC3B,cAAQ,MAAM;AACd,YAAM,gBAAgB,oBAAoB,qBAAqB;AAC/D,gBAAU,SAAS;AACnB,YAAM,YAAY,gBACd,KAAK,KAAK,yBAAyB,EAAE,MAAM,cAAc,CAAC,IAC1D,QAAQ,QAAQ;AACpB,gBACG,KAAK,MAAM,KAAK,IAA0B,qBAAqB,CAAC,EAChE,KAAK,CAAC,aAAa;AAClB,YAAI,CAAC,OAAQ;AACb,kBAAU,SAAS,KAAK,OAAO;AAAA,MACjC,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,YAAI,CAAC,OAAQ;AACb,6BAAqB,KAAK;AAAA,MAC5B,CAAC;AACH,aAAO,MAAM;AAAE,iBAAS;AAAA,MAAO;AAAA,IACjC;AAIA,QAAI,OAAO,SAAS,aAAa,kBAAkB;AACjD,cAAQ,IAAI;AACZ,gBAAU,iBAAiB;AAC3B;AAAA,IACF;AACA,UAAM,aAAa,oBAAoB,YAAY;AACnD,UAAM,WAAW,oBAAoB,UAAU;AAC/C,UAAM,SAAS,QAAQ,IAAI;AAE3B,QAAI,cAAc,cAAc,SAAS;AACvC,cAAQ,IAAI;AACZ,gBAAU,SAAS;AACnB,UAAI,CAAC,cAAc,SAAS;AAC1B,gBAAQ,MAAM;AACd,sBAAc;AACd,cAAM,aAAa,IAAI,gBAAgB;AACvC,oBAAY,UAAU;AAGtB,sBAAc,UAAU,KAAK;AAAA,UAAwB;AAAA,UAAyB,EAAE,MAAM,WAAW;AAAA,UAC/F,EAAE,QAAQ,WAAW,QAAQ,SAAS,EAAE,mBAAmB,OAAO,eAAe,MAAM,EAAE;AAAA,QAC3F,EAAE,KAAK,OAAO,aAAa;AACzB,cAAI,WAAW,OAAO,QAAS,OAAM,IAAI,MAAM,mBAAmB;AAClE,gBAAMC,SAAQ,SAAS,KAAK;AAC5B,cAAI,CAACA,QAAO;AACV,kBAAM,QAAkB;AAAA,cACtB,MAAM;AAAA,cACN,SAAS;AAAA,cACT,QAAQ;AAAA,YACV;AACA,kBAAM;AAAA,UACR;AACA,gBAAM,aAAa,MAAM,KAAK,IAA0B,uBAAuB;AAAA,YAC7E,QAAQ,WAAW;AAAA,YACnB,SAAS,EAAE,eAAe,UAAUA,MAAK,IAAI,mBAAmB,MAAM;AAAA,UACxE,CAAC;AACD,iBAAO,EAAE,OAAAA,QAAO,MAAM,WAAW,KAAK,QAAQ;AAAA,QAChD,CAAC;AAAA,MACH;AACA,YAAM,UAAU,cAAc;AAC9B,cAAQ,KAAK,CAAC,EAAE,OAAAA,QAAO,MAAM,KAAK,MAAM;AACtC,YAAI,CAAC,UAAU,cAAc,YAAY,QAAS;AAClD,gBAAQ,IAAIA,MAAK;AACjB,kBAAU,IAAI;AACd,sBAAc,UAAU;AAAA,MAC1B,CAAC,EAAE,MAAM,CAAC,UAAU;AAClB,YAAI,CAAC,UAAU,cAAc,YAAY,QAAS;AAClD,sBAAc,UAAU;AACxB,gBAAQ,MAAM;AACd,sBAAc;AACd,6BAAqB,KAAK;AAAA,MAC5B,CAAC;AACD,aAAO,MAAM;AAAE,iBAAS;AAAA,MAAO;AAAA,IACjC;AAEA,UAAM,QAAQ,YAAY,YAAY;AACtC,QAAI,SAAS,UAAU,OAAQ,SAAQ,IAAI,KAAK;AAChD,QAAI,CAAC,OAAO;AACV,cAAQ,IAAI;AACZ,gBAAU,iBAAiB;AAC3B,8BAAwB;AACxB;AAAA,IACF;AACA,cAAU,SAAS;AACnB,SAAK,IAA0B,qBAAqB,EACjD,KAAK,CAAC,aAAa;AAClB,UAAI,CAAC,OAAQ;AACb,gBAAU,SAAS,KAAK,OAAO;AAAA,IACjC,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,UAAI,CAAC,OAAQ;AACb,2BAAqB,KAAK;AAAA,IAC5B,CAAC;AACH,WAAO,MAAM;AAAE,eAAS;AAAA,IAAO;AAAA,EACjC,GAAG,CAAC,MAAM,SAAS,YAAY,UAAU,yBAAyB,sBAAsB,WAAW,aAAa,YAAY,QAAQ,WAAW,CAAC;AAEhJ,QAAM,WAAW,OAAQ,MAA0C,YAAY,MAAM,QAAQ,EAAE;AAC/F,QAAM,QAAQ,WAAW,CAAC,QAAQ,IAAI,CAAC;AACvC,QAAM,eAAe,oBAAoB,IAAI;AAC7C,QAAM,cAAc,oBAAoB,IAAI,KAAK;AACjD,QAAM,gBAAgBF;AAAA,IACpB,CAAC,eAAmC,IAAI,MAAM,UAAU;AAAA,IACxD,CAAC,IAAI;AAAA,EACP;AAEA,QAAM,QAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,WAAW,mBAAmB,WAAW;AAAA,IAC1D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,MAAM,OAAO;AAAA,IACrB,cAAc,MAAM,OAAO,EAAE,UAAU,MAAM,CAAC;AAAA,EAChD;AAEA,SAAO,gBAAAJ,KAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AACvD;AAEO,SAAS,aAA+B;AAC7C,QAAM,UAAUO,YAAW,WAAW;AACtC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,0EAA0E;AACxG,SAAO;AACT;","names":["axios","axios","createContext","useContext","useMemo","jsx","createContext","useCallback","useContext","useEffect","useRef","useState","createContext","useCallback","useContext","useState","jsx","jsx","createContext","useState","useRef","useCallback","useEffect","token","useContext"]}
|
|
File without changes
|
|
File without changes
|