SessionIndicator.jsx 987 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. "use client";
  2. import React from "react";
  3. import { Loader2 } from "lucide-react";
  4. import { useAuth } from "@/components/auth/authContext";
  5. import { useDebouncedVisibility } from "@/lib/frontend/hooks/useDebouncedVisibility";
  6. export default function SessionIndicator() {
  7. const { status, isValidating } = useAuth();
  8. const isActive = status === "loading" || Boolean(isValidating);
  9. // Debounce policy:
  10. // - Show only if it lasts longer than 200ms.
  11. // - Once shown, keep it visible for at least 250ms to avoid blinking.
  12. const visible = useDebouncedVisibility(isActive, {
  13. delayMs: 200,
  14. minVisibleMs: 250,
  15. });
  16. if (!visible) return null;
  17. return (
  18. <div
  19. className="flex items-center gap-2"
  20. aria-live="polite"
  21. title="Sitzung wird geprüft"
  22. >
  23. <Loader2
  24. className="h-4 w-4 animate-spin text-muted-foreground"
  25. aria-hidden="true"
  26. />
  27. <span className="hidden text-xs text-muted-foreground md:inline">
  28. Sitzung wird geprüft…
  29. </span>
  30. </div>
  31. );
  32. }