Loading components/signup/signup-form.tsx +21 −74 Changes for components/signup/signup-form.tsx: 21 added lines, 74 removed lines. Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } } } Loading Loading
components/signup/signup-form.tsx +21 −74 Changes for components/signup/signup-form.tsx: 21 added lines, 74 removed lines. Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } } } Loading