Remove the complex token-passing logic for new tabs in embedded mode. Instead, navigation now stays within the iframe for a simpler UX. - Remove handleNewWindowClick auth handler from sidebar items - Simplify useNewWindow hook to navigate within iframe when embedded 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
73 lines
2.3 KiB
TypeScript
73 lines
2.3 KiB
TypeScript
import { useNavigate, useSearchParams } from 'react-router-dom';
|
|
|
|
import { useEmbedding } from '../components/embed-provider';
|
|
|
|
import { authenticationSession } from './authentication-session';
|
|
|
|
export const useNewWindow = () => {
|
|
const { embedState } = useEmbedding();
|
|
const navigate = useNavigate();
|
|
if (embedState.isEmbedded) {
|
|
// In embedded mode, navigate within the iframe (don't open new tabs)
|
|
return (route: string, searchParams?: string) =>
|
|
navigate({
|
|
pathname: route,
|
|
search: searchParams,
|
|
});
|
|
} else {
|
|
return (route: string, searchParams?: string) =>
|
|
window.open(
|
|
`${route}${searchParams ? '?' + searchParams : ''}`,
|
|
'_blank',
|
|
'noopener noreferrer',
|
|
);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Opens a route in a new browser tab with automatic authentication.
|
|
* For embedded contexts where sessionStorage isn't shared across tabs,
|
|
* this passes the JWT token via URL for auto-login.
|
|
*/
|
|
export const useOpenInNewTab = () => {
|
|
const { embedState } = useEmbedding();
|
|
|
|
return (route: string, searchParams?: string) => {
|
|
const token = authenticationSession.getToken();
|
|
|
|
if (embedState.isEmbedded && token) {
|
|
// In embedded mode, pass token for auto-authentication in new tab
|
|
const encodedRedirect = encodeURIComponent(
|
|
`${route}${searchParams ? '?' + searchParams : ''}`,
|
|
);
|
|
const authUrl = `/authenticate?token=${encodeURIComponent(token)}&redirect=${encodedRedirect}`;
|
|
window.open(authUrl, '_blank', 'noopener');
|
|
} else {
|
|
// Non-embedded mode - token is already in localStorage
|
|
window.open(
|
|
`${route}${searchParams ? '?' + searchParams : ''}`,
|
|
'_blank',
|
|
'noopener noreferrer',
|
|
);
|
|
}
|
|
};
|
|
};
|
|
|
|
export const FROM_QUERY_PARAM = 'from';
|
|
/**State param is for oauth2 flow, it is used to redirect to the page after login*/
|
|
export const STATE_QUERY_PARAM = 'state';
|
|
export const LOGIN_QUERY_PARAM = 'activepiecesLogin';
|
|
export const PROVIDER_NAME_QUERY_PARAM = 'providerName';
|
|
|
|
export const useDefaultRedirectPath = () => {
|
|
return '/flows';
|
|
};
|
|
|
|
export const useRedirectAfterLogin = () => {
|
|
const navigate = useNavigate();
|
|
const [searchParams] = useSearchParams();
|
|
const defaultRedirectPath = useDefaultRedirectPath();
|
|
const from = searchParams.get(FROM_QUERY_PARAM) ?? defaultRedirectPath;
|
|
return () => navigate(from);
|
|
};
|