mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-04-23 17:18:32 +02:00
Active environment in query param
This commit is contained in:
@@ -1,19 +1,18 @@
|
|||||||
import { createBrowserRouter, Navigate, Outlet, RouterProvider } from 'react-router-dom';
|
import { createBrowserRouter, Navigate, Outlet, RouterProvider, useParams } from 'react-router-dom';
|
||||||
import { routePaths, useAppRoutes } from '../hooks/useAppRoutes';
|
import { routePaths, useAppRoutes } from '../hooks/useAppRoutes';
|
||||||
import { useRecentRequests } from '../hooks/useRecentRequests';
|
|
||||||
import { useHttpRequests } from '../hooks/useHttpRequests';
|
import { useHttpRequests } from '../hooks/useHttpRequests';
|
||||||
|
import { useRecentRequests } from '../hooks/useRecentRequests';
|
||||||
|
import { DialogProvider } from './DialogContext';
|
||||||
import { GlobalHooks } from './GlobalHooks';
|
import { GlobalHooks } from './GlobalHooks';
|
||||||
|
import RouteError from './RouteError';
|
||||||
import Workspace from './Workspace';
|
import Workspace from './Workspace';
|
||||||
import Workspaces from './Workspaces';
|
import Workspaces from './Workspaces';
|
||||||
import { DialogProvider } from './DialogContext';
|
|
||||||
import { useActiveEnvironmentId } from '../hooks/useActiveEnvironmentId';
|
|
||||||
import RouteError from './RouteError';
|
|
||||||
|
|
||||||
const router = createBrowserRouter([
|
const router = createBrowserRouter([
|
||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
errorElement: <RouteError />,
|
errorElement: <RouteError />,
|
||||||
element: <Layout />,
|
element: <DefaultLayout />,
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
@@ -26,18 +25,20 @@ const router = createBrowserRouter([
|
|||||||
{
|
{
|
||||||
path: routePaths.workspace({
|
path: routePaths.workspace({
|
||||||
workspaceId: ':workspaceId',
|
workspaceId: ':workspaceId',
|
||||||
environmentId: ':environmentId',
|
|
||||||
}),
|
}),
|
||||||
element: <WorkspaceOrRedirect />,
|
element: <WorkspaceOrRedirect />,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: routePaths.request({
|
path: routePaths.request({
|
||||||
workspaceId: ':workspaceId',
|
workspaceId: ':workspaceId',
|
||||||
environmentId: ':environmentId',
|
|
||||||
requestId: ':requestId',
|
requestId: ':requestId',
|
||||||
}),
|
}),
|
||||||
element: <Workspace />,
|
element: <Workspace />,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/workspaces/:workspaceId/environments/:environmentId/requests/:requestId',
|
||||||
|
element: <RedirectLegacyEnvironmentURLs />,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
@@ -48,7 +49,6 @@ export function AppRouter() {
|
|||||||
|
|
||||||
function WorkspaceOrRedirect() {
|
function WorkspaceOrRedirect() {
|
||||||
const recentRequests = useRecentRequests();
|
const recentRequests = useRecentRequests();
|
||||||
const activeEnvironmentId = useActiveEnvironmentId();
|
|
||||||
const requests = useHttpRequests();
|
const requests = useHttpRequests();
|
||||||
const request = requests.find((r) => r.id === recentRequests[0]);
|
const request = requests.find((r) => r.id === recentRequests[0]);
|
||||||
const routes = useAppRoutes();
|
const routes = useAppRoutes();
|
||||||
@@ -58,20 +58,43 @@ function WorkspaceOrRedirect() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const { id: requestId, workspaceId } = request;
|
const { id: requestId, workspaceId } = request;
|
||||||
const environmentId = activeEnvironmentId ?? undefined;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Navigate
|
<Navigate
|
||||||
to={routes.paths.request({
|
to={routes.paths.request({
|
||||||
workspaceId,
|
workspaceId,
|
||||||
environmentId,
|
|
||||||
requestId,
|
requestId,
|
||||||
})}
|
})}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function Layout() {
|
function RedirectLegacyEnvironmentURLs() {
|
||||||
|
const routes = useAppRoutes();
|
||||||
|
const {
|
||||||
|
requestId,
|
||||||
|
environmentId: rawEnvironmentId,
|
||||||
|
workspaceId,
|
||||||
|
} = useParams<{
|
||||||
|
requestId?: string;
|
||||||
|
workspaceId?: string;
|
||||||
|
environmentId?: string;
|
||||||
|
}>();
|
||||||
|
const environmentId = rawEnvironmentId === '__default__' ? undefined : rawEnvironmentId;
|
||||||
|
|
||||||
|
let to = '/';
|
||||||
|
if (workspaceId != null && requestId != null) {
|
||||||
|
to = routes.paths.request({ workspaceId, environmentId, requestId });
|
||||||
|
} else if (workspaceId != null) {
|
||||||
|
to = routes.paths.workspace({ workspaceId, environmentId });
|
||||||
|
} else {
|
||||||
|
to = routes.paths.workspaces();
|
||||||
|
}
|
||||||
|
|
||||||
|
return <Navigate to={to} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
function DefaultLayout() {
|
||||||
return (
|
return (
|
||||||
<DialogProvider>
|
<DialogProvider>
|
||||||
<Outlet />
|
<Outlet />
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
import { useParams } from 'react-router-dom';
|
import { useSearchParams } from 'react-router-dom';
|
||||||
import type { RouteParamsRequest } from './useAppRoutes';
|
|
||||||
|
export const QUERY_ENVIRONMENT_ID = 'environment_id';
|
||||||
|
|
||||||
export function useActiveEnvironmentId(): string | null {
|
export function useActiveEnvironmentId(): string | null {
|
||||||
const { environmentId } = useParams<RouteParamsRequest>();
|
const [params] = useSearchParams();
|
||||||
if (environmentId == null || environmentId === '__default__') {
|
const environmentId = params.get(QUERY_ENVIRONMENT_ID);
|
||||||
|
if (environmentId == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
import { QUERY_ENVIRONMENT_ID } from './useActiveEnvironmentId';
|
||||||
import { useActiveWorkspaceId } from './useActiveWorkspaceId';
|
import { useActiveWorkspaceId } from './useActiveWorkspaceId';
|
||||||
import { useActiveRequestId } from './useActiveRequestId';
|
import { useActiveRequestId } from './useActiveRequestId';
|
||||||
import type { Environment } from '../lib/models';
|
import type { Environment } from '../lib/models';
|
||||||
@@ -23,7 +24,11 @@ export const routePaths = {
|
|||||||
environmentId: ':environmentId',
|
environmentId: ':environmentId',
|
||||||
} as RouteParamsWorkspace,
|
} as RouteParamsWorkspace,
|
||||||
) {
|
) {
|
||||||
return `/workspaces/${workspaceId}/environments/${environmentId ?? '__default__'}`;
|
let path = `/workspaces/${workspaceId}`;
|
||||||
|
if (environmentId != null) {
|
||||||
|
path += `?${QUERY_ENVIRONMENT_ID}=${encodeURIComponent(environmentId)}`;
|
||||||
|
}
|
||||||
|
return path;
|
||||||
},
|
},
|
||||||
request(
|
request(
|
||||||
{ workspaceId, environmentId, requestId } = {
|
{ workspaceId, environmentId, requestId } = {
|
||||||
@@ -32,7 +37,11 @@ export const routePaths = {
|
|||||||
requestId: ':requestId',
|
requestId: ':requestId',
|
||||||
} as RouteParamsRequest,
|
} as RouteParamsRequest,
|
||||||
) {
|
) {
|
||||||
return `${this.workspace({ workspaceId, environmentId })}/requests/${requestId}`;
|
let path = `/workspaces/${workspaceId}/requests/${requestId}`;
|
||||||
|
if (environmentId != null) {
|
||||||
|
path += `?${QUERY_ENVIRONMENT_ID}=${encodeURIComponent(environmentId)}`;
|
||||||
|
}
|
||||||
|
return path;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -41,16 +50,16 @@ export function useAppRoutes() {
|
|||||||
const requestId = useActiveRequestId();
|
const requestId = useActiveRequestId();
|
||||||
const nav = useNavigate();
|
const nav = useNavigate();
|
||||||
|
|
||||||
const navigate = useCallback(<T extends keyof typeof routePaths>(
|
const navigate = useCallback(
|
||||||
path: T,
|
<T extends keyof typeof routePaths>(path: T, ...params: Parameters<(typeof routePaths)[T]>) => {
|
||||||
...params: Parameters<(typeof routePaths)[T]>
|
// Not sure how to make TS work here, but it's good from the
|
||||||
) => {
|
// outside caller perspective.
|
||||||
// Not sure how to make TS work here, but it's good from the
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
// outside caller perspective.
|
const resolvedPath = routePaths[path](...(params as any));
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
nav(resolvedPath);
|
||||||
const resolvedPath = routePaths[path](...(params as any));
|
},
|
||||||
nav(resolvedPath);
|
[nav],
|
||||||
}, [nav]);
|
);
|
||||||
|
|
||||||
const setEnvironment = useCallback(
|
const setEnvironment = useCallback(
|
||||||
(environment: Environment | null) => {
|
(environment: Environment | null) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user