feat(devices): adiciona modais de confirmacao e deteccao em tempo real
All checks were successful
All checks were successful
- Adiciona modais de confirmacao para resetar e desativar dispositivos - Cria query getMachineState no Convex para monitoramento em tempo real - Implementa MachineStateMonitor no desktop para detectar mudancas - Desktop redireciona para tela de registro apos reset - Desktop mostra tela de desativacao imediatamente apos bloqueio 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
cd3305f1e3
commit
0bfe4edc6c
4 changed files with 263 additions and 2 deletions
78
apps/desktop/src/components/MachineStateMonitor.tsx
Normal file
78
apps/desktop/src/components/MachineStateMonitor.tsx
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
/**
|
||||
* MachineStateMonitor - Componente para monitorar o estado da máquina em tempo real
|
||||
*
|
||||
* Este componente usa uma subscription Convex para detectar mudanças no estado da máquina:
|
||||
* - Quando isActive muda para false: máquina foi desativada
|
||||
* - Quando hasValidToken muda para false: máquina foi resetada (tokens revogados)
|
||||
*
|
||||
* O componente não renderiza nada, apenas monitora e chama callbacks quando detecta mudanças.
|
||||
*/
|
||||
|
||||
import { useEffect, useRef } from "react"
|
||||
import { useQuery, ConvexProvider } from "convex/react"
|
||||
import type { ConvexReactClient } from "convex/react"
|
||||
import { api } from "../convex/_generated/api"
|
||||
import type { Id } from "../convex/_generated/dataModel"
|
||||
|
||||
type MachineStateMonitorProps = {
|
||||
machineId: string
|
||||
onDeactivated?: () => void
|
||||
onTokenRevoked?: () => void
|
||||
}
|
||||
|
||||
function MachineStateMonitorInner({ machineId, onDeactivated, onTokenRevoked }: MachineStateMonitorProps) {
|
||||
const machineState = useQuery(api.machines.getMachineState, {
|
||||
machineId: machineId as Id<"machines">,
|
||||
})
|
||||
|
||||
// Refs para rastrear o estado anterior e evitar chamadas duplicadas
|
||||
const previousIsActive = useRef<boolean | null>(null)
|
||||
const previousHasValidToken = useRef<boolean | null>(null)
|
||||
const initialLoadDone = useRef(false)
|
||||
|
||||
useEffect(() => {
|
||||
if (!machineState) return
|
||||
|
||||
// Na primeira carga, apenas armazena os valores iniciais
|
||||
if (!initialLoadDone.current) {
|
||||
previousIsActive.current = machineState.isActive
|
||||
previousHasValidToken.current = machineState.hasValidToken
|
||||
initialLoadDone.current = true
|
||||
return
|
||||
}
|
||||
|
||||
// Detecta mudança de ativo para inativo
|
||||
if (previousIsActive.current === true && machineState.isActive === false) {
|
||||
console.log("[MachineStateMonitor] Máquina foi desativada")
|
||||
onDeactivated?.()
|
||||
}
|
||||
|
||||
// Detecta mudança de token válido para inválido
|
||||
if (previousHasValidToken.current === true && machineState.hasValidToken === false) {
|
||||
console.log("[MachineStateMonitor] Token foi revogado (reset)")
|
||||
onTokenRevoked?.()
|
||||
}
|
||||
|
||||
// Atualiza refs
|
||||
previousIsActive.current = machineState.isActive
|
||||
previousHasValidToken.current = machineState.hasValidToken
|
||||
}, [machineState, onDeactivated, onTokenRevoked])
|
||||
|
||||
// Este componente nao renderiza nada
|
||||
return null
|
||||
}
|
||||
|
||||
type MachineStateMonitorWithClientProps = MachineStateMonitorProps & {
|
||||
client: ConvexReactClient
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper que recebe o cliente Convex e envolve o monitor com o provider
|
||||
*/
|
||||
export function MachineStateMonitor({ client, ...props }: MachineStateMonitorWithClientProps) {
|
||||
return (
|
||||
<ConvexProvider client={client}>
|
||||
<MachineStateMonitorInner {...props} />
|
||||
</ConvexProvider>
|
||||
)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue