Files
smoothschedule/activepieces-fork/packages/react-ui/src/lib/navigation-utils.tsx
poduck 1d1cfbb164 Simplify embedded mode navigation to stay within iframe
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>
2025-12-30 10:45:01 -05:00

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);
};