SessionIndicator.jsx 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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. import {
  7. SESSION_INDICATOR_DELAY_MS,
  8. SESSION_INDICATOR_MIN_VISIBLE_MS,
  9. } from "@/lib/frontend/ui/uxTimings";
  10. import {
  11. Tooltip,
  12. TooltipContent,
  13. TooltipTrigger,
  14. } from "@/components/ui/tooltip";
  15. export default function SessionIndicator() {
  16. const { status, isValidating } = useAuth();
  17. const isActive = status === "loading" || Boolean(isValidating);
  18. const visible = useDebouncedVisibility(isActive, {
  19. delayMs: SESSION_INDICATOR_DELAY_MS,
  20. minVisibleMs: SESSION_INDICATOR_MIN_VISIBLE_MS,
  21. });
  22. if (!visible) return null;
  23. return (
  24. <Tooltip>
  25. <TooltipTrigger asChild>
  26. <div className="flex items-center gap-2" aria-live="polite">
  27. <Loader2
  28. className="h-4 w-4 animate-spin text-muted-foreground"
  29. aria-hidden="true"
  30. />
  31. <span className="hidden text-xs text-muted-foreground md:inline">
  32. Sitzung wird geprüft…
  33. </span>
  34. </div>
  35. </TooltipTrigger>
  36. <TooltipContent side="bottom">Sitzung wird geprüft…</TooltipContent>
  37. </Tooltip>
  38. );
  39. }