Commit f33a6a50 authored by Labros Papadopoulos's avatar Labros Papadopoulos
Browse files

fix: grafana pop up close

parent 3d54b13f
Loading
Loading
Loading
Loading
Loading
+21 −74
Changes for components/signup/signup-form.tsx: 21 added lines, 74 removed lines.
Original line number Diff line number Diff line
@@ -9,7 +9,6 @@ type CreateResp = Awaited<ReturnType<typeof createIndividualFromSignup>>;

export default function SignUpForm() {
  const grafanaWinRef = React.useRef<Window | null>(null);
  const grafanaCloseTimerRef = React.useRef<number | null>(null);
  const [value, setValue] = useState('');
  const [orgValue, setOrgValue] = useState('');
  const [showDiv, setShowDiv] = useState(false);
@@ -85,95 +84,43 @@ export default function SignUpForm() {
      }
    }
  }
  const GRAFANA_CLOSE_DELAY_MS = 2000;

  function closeGrafanaWindow() {
    try {
      if (grafanaWinRef.current && !grafanaWinRef.current.closed) {
        grafanaWinRef.current.close();
      }
    } catch (e) {
      console.error('Failed to close Grafana window', e);
    } finally {
      grafanaWinRef.current = null;
    }
  }
  // Attempt to open Grafana in a new tab once per browser if the user has the
  // service-provider role. After attempting, navigate to `redirectUrl`.
  async function attemptOpenGrafanaThenRedirect(redirectUrl: string) {
    const grafanaUrl = await getGrafanaUrl();
    try {
      if (typeof window !== 'undefined') {
        // Check server session for roles
    try {
          const res = await fetch('/api/auth/session');
          if (res.ok) {
            const sess = await res.json();
            if (sess?.user?.roles && sess.user.roles.includes('service-provider')) {
              // Prefer the placeholder window we opened on user gesture so we
              // don't trigger popup blockers or open a duplicate tab.
      const grafanaUrl = await getGrafanaUrl();
      const w =
                (grafanaWinRef.current && !grafanaWinRef.current.closed
        grafanaWinRef.current && !grafanaWinRef.current.closed
          ? grafanaWinRef.current
                  : window.open(grafanaUrl, '_blank', 'noopener,noreferrer')) || null;
              console.log('Grafana window selected', {
                grafanaWinRef: grafanaWinRef.current,
                w,
              });
              try {
                // If we have a placeholder (about:blank) or an opened window,
                // navigate it to the Grafana URL so the opener-initiated window
                // performs the navigation (avoids popup blockers).
                try {
          : window.open(grafanaUrl, '_blank'); // no 'noopener', or you lose the handle

      if (w) {
                    // assign location even if it's already pointed to the URL;
                    // this is safe and forces navigation when needed.
        grafanaWinRef.current = w;
        w.location.href = grafanaUrl;
                  }
                } catch (navErr) {
                  // setting location can occasionally throw in strict cross-origin
                  // scenarios; log but continue to attempt focus.
                  console.error('Failed to set Grafana window location', navErr);
                }

                w?.focus();

                // Schedule auto-close of the Grafana window after a short, hard-coded delay (1000ms).
                // We intentionally use a fixed value instead of an env var for simplicity.
                // clear any previous timer
                if (grafanaCloseTimerRef.current) {
                  console.log(
                    'Clearing previous grafana close timer',
                    grafanaCloseTimerRef.current,
                  );
                  clearTimeout(grafanaCloseTimerRef.current);
                  grafanaCloseTimerRef.current = null;
                }

                if (w) {
                  const autoCloseMs = 1000;
                  console.log('Scheduling grafana auto-close (ms)', autoCloseMs);
                  const timerId = window.setTimeout(() => {
                    try {
                      if (w && !w.closed) {
                        w.close();
                      }
                    } catch (closeErr) {
                      console.error('Failed to auto-close Grafana window', closeErr);
                    } finally {
                      grafanaWinRef.current = null;
                      grafanaCloseTimerRef.current = null;
                    }
                  }, autoCloseMs);
                  grafanaCloseTimerRef.current = timerId as unknown as number;
                  console.log('Scheduled grafana auto-close timer', grafanaCloseTimerRef.current);
                }
              } catch (e) {
                console.error('Failed to focus Grafana popup window', e);
              }
            }
          }
        } catch (e) {
          console.error('Failed to fetch /api/auth/session during signup flow', e);
        }
        // Wait HERE, before redirecting, so the page isn't unloaded mid-timer
        await new Promise((resolve) => setTimeout(resolve, GRAFANA_CLOSE_DELAY_MS));
        closeGrafanaWindow();
      }
    } catch (e) {
      console.error('Unexpected error in attemptOpenGrafanaThenRedirect', e);
      closeGrafanaWindow();
    } finally {
      // always redirect to the app's root after signup flow
      try {
      window.location.href = redirectUrl;
      } catch (e) {
        console.error('Failed to redirect to', redirectUrl, e);
      }
    }
  }