SurfSense/surfsense_web/components/TokenHandler.tsx

78 lines
2.9 KiB
TypeScript
Raw Normal View History

2025-07-27 10:05:37 -07:00
"use client";
2025-04-07 23:47:06 -07:00
import { useSearchParams } from "next/navigation";
2025-07-27 10:41:15 -07:00
import { useEffect } from "react";
import { useGlobalLoadingEffect } from "@/hooks/use-global-loading";
import { getAndClearRedirectPath, setBearerToken } from "@/lib/auth-utils";
2026-01-09 15:00:15 +02:00
import { trackLoginSuccess } from "@/lib/posthog/events";
2025-04-07 23:47:06 -07:00
interface TokenHandlerProps {
redirectPath?: string; // Default path to redirect after storing token (if no saved path)
2025-07-27 10:05:37 -07:00
tokenParamName?: string; // Name of the URL parameter containing the token
storageKey?: string; // Key to use when storing in localStorage (kept for backwards compatibility)
2025-04-07 23:47:06 -07:00
}
/**
* Client component that extracts a token from URL parameters and stores it in localStorage
* After storing the token, it redirects the user back to the page they were on before
* being redirected to login (if available), or to the default redirectPath.
2025-07-27 10:05:37 -07:00
*
* @param redirectPath - Default path to redirect after storing token (default: '/dashboard')
2025-04-07 23:47:06 -07:00
* @param tokenParamName - Name of the URL parameter containing the token (default: 'token')
* @param storageKey - Key to use when storing in localStorage (default: 'surfsense_bearer_token')
2025-04-07 23:47:06 -07:00
*/
const TokenHandler = ({
redirectPath = "/dashboard",
2025-07-27 10:05:37 -07:00
tokenParamName = "token",
storageKey = "surfsense_bearer_token",
2025-04-07 23:47:06 -07:00
}: TokenHandlerProps) => {
2025-07-27 10:05:37 -07:00
const searchParams = useSearchParams();
// Always show loading for this component - spinner animation won't reset
2026-01-27 15:28:30 +05:30
useGlobalLoadingEffect(true);
2025-07-27 10:05:37 -07:00
useEffect(() => {
// Only run on client-side
if (typeof window === "undefined") return;
// Get token from URL parameters
const token = searchParams.get(tokenParamName);
if (token) {
try {
2026-01-09 15:00:15 +02:00
// Track login success for OAuth flows (e.g., Google)
// Local login already tracks success before redirecting here
const alreadyTracked = sessionStorage.getItem("login_success_tracked");
if (!alreadyTracked) {
// This is an OAuth flow (Google login) - track success
trackLoginSuccess("google");
}
// Clear the flag for future logins
sessionStorage.removeItem("login_success_tracked");
2026-01-09 15:01:33 +02:00
// Store token in localStorage using both methods for compatibility
localStorage.setItem(storageKey, token);
setBearerToken(token);
// Check if there's a saved redirect path from before the auth flow
const savedRedirectPath = getAndClearRedirectPath();
// Use the saved path if available, otherwise use the default redirectPath
const finalRedirectPath = savedRedirectPath || redirectPath;
2026-01-09 15:01:33 +02:00
// Redirect to the appropriate path
window.location.href = finalRedirectPath;
} catch (error) {
console.error("Error storing token in localStorage:", error);
// Even if there's an error, try to redirect to the default path
window.location.href = redirectPath;
}
2025-07-27 10:05:37 -07:00
}
}, [searchParams, tokenParamName, storageKey, redirectPath]);
2025-07-27 10:05:37 -07:00
// Return null - the global provider handles the loading UI
return null;
2025-04-07 23:47:06 -07:00
};
2025-07-27 10:05:37 -07:00
export default TokenHandler;