diff --git a/apps/console/src/components/OrganizationErrorBoundary.tsx b/apps/console/src/components/OrganizationErrorBoundary.tsx
index 70f7bfe97..4adb762ba 100644
--- a/apps/console/src/components/OrganizationErrorBoundary.tsx
+++ b/apps/console/src/components/OrganizationErrorBoundary.tsx
@@ -15,7 +15,7 @@ export function OrganizationErrorBoundary() {
}
if (error instanceof AssumptionRequiredError) {
- return ;
+ return ;
}
return ;
diff --git a/apps/console/src/pages/iam/auth/AuthLayout.tsx b/apps/console/src/pages/iam/auth/AuthLayout.tsx
index 84516d3f1..a1d3a2790 100644
--- a/apps/console/src/pages/iam/auth/AuthLayout.tsx
+++ b/apps/console/src/pages/iam/auth/AuthLayout.tsx
@@ -1,9 +1,12 @@
import { Card, Logo } from "@probo/ui";
+import type { PropsWithChildren } from "react";
import { Outlet } from "react-router";
import { IAMRelayProvider } from "#/providers/IAMRelayProvider";
-export default function AuthLayout() {
+export default function AuthLayout(props: PropsWithChildren) {
+ const { children } = props;
+
return (
@@ -12,7 +15,7 @@ export default function AuthLayout() {
-
+ {children ?? }
diff --git a/apps/console/src/pages/iam/organizations/AssumePage.tsx b/apps/console/src/pages/iam/organizations/AssumePage.tsx
new file mode 100644
index 000000000..5da6f9909
--- /dev/null
+++ b/apps/console/src/pages/iam/organizations/AssumePage.tsx
@@ -0,0 +1,35 @@
+import { useTranslate } from "@probo/i18n";
+import { useLocation, useNavigate } from "react-router";
+
+import { useAssume } from "#/hooks/iam/useAssume";
+
+import AuthLayout from "../auth/AuthLayout";
+
+interface State {
+ from: string;
+}
+
+export default function AssumePage() {
+ const navigate = useNavigate();
+ const location = useLocation();
+ const state = location.state as State;
+
+ const { __ } = useTranslate();
+
+ useAssume({
+ onSuccess: () => void navigate(state.from),
+ });
+
+ return (
+
+
+
+
{__("Sign in Redirection")}
+
+ {__("Redirecting you to your authentication URL…")}
+
+
+
+
+ );
+}
diff --git a/apps/console/src/routes.tsx b/apps/console/src/routes.tsx
index 51589f5cb..367bfe9ff 100644
--- a/apps/console/src/routes.tsx
+++ b/apps/console/src/routes.tsx
@@ -120,119 +120,127 @@ const routes = [
() => import("./pages/DocumentSigningRequestsPage"),
),
},
- {
- path: "/organizations/:organizationId/employee",
- Component: lazy(
- () => import("./pages/organizations/employee/EmployeeLayoutLoader"),
- ),
- ErrorBoundary: OrganizationErrorBoundary,
- children: [
- {
- index: true,
- Component: lazy(
- () =>
- import("./pages/organizations/employee/EmployeeDocumentsPageLoader"),
- ),
- },
- {
- path: ":documentId",
- Component: lazy(
- () =>
- import("./pages/organizations/employee/EmployeeDocumentSignaturePageLoader"),
- ),
- },
- ],
- },
{
path: "/organizations/:organizationId",
- Component: lazy(
- () => import("./pages/iam/organizations/ViewerMembershipLayoutLoader"),
- ),
- ErrorBoundary: OrganizationErrorBoundary,
children: [
{
- path: "",
- Component: () => {
- const { role } = use(CurrentUser);
- switch (role) {
- case Role.EMPLOYEE:
- return ;
- case Role.AUDITOR:
- return ;
- default:
- return ;
- }
- },
+ path: "assume",
+ Component: lazy(() => import("./pages/iam/organizations/AssumePage")),
},
{
- path: "settings",
- Fallback: PageSkeleton,
+ path: "employee",
Component: lazy(
- () => import("./pages/iam/organizations/settings/SettingsLayout"),
+ () => import("./pages/organizations/employee/EmployeeLayoutLoader"),
),
+ ErrorBoundary: OrganizationErrorBoundary,
children: [
{
index: true,
- loader: () => {
- // eslint-disable-next-line
- throw redirect("general");
- },
- },
- {
- path: "general",
Component: lazy(
() =>
- import("./pages/iam/organizations/settings/GeneralSettingsPageLoader"),
+ import("./pages/organizations/employee/EmployeeDocumentsPageLoader"),
),
},
{
- path: "members",
+ path: ":documentId",
Component: lazy(
() =>
- import("./pages/iam/organizations/settings/MembersPageLoader"),
- ),
- },
- {
- path: "saml-sso",
- Component: lazy(
- () =>
- import("./pages/iam/organizations/settings/SAMLSettingsPageLoader"),
- ),
- },
- {
- path: "scim",
- Component: lazy(
- () =>
- import("./pages/iam/organizations/settings/SCIMSettingsPageLoader"),
+ import("./pages/organizations/employee/EmployeeDocumentSignaturePageLoader"),
),
},
],
},
- ...riskRoutes,
- ...measureRoutes,
- ...documentsRoutes,
- ...peopleRoutes,
- ...vendorRoutes,
- ...frameworkRoutes,
- ...taskRoutes,
- ...assetRoutes,
- ...dataRoutes,
- ...auditRoutes,
- ...meetingsRoutes,
- ...nonconformityRoutes,
- ...obligationRoutes,
- ...continualImprovementRoutes,
- ...rightsRequestRoutes,
- ...processingActivityRoutes,
- ...statesOfApplicabilityRoutes,
- ...compliancePageRoutes,
- ...snapshotsRoutes,
{
- path: "*",
- Component: PageError,
+ Component: lazy(
+ () => import("./pages/iam/organizations/ViewerMembershipLayoutLoader"),
+ ),
+ ErrorBoundary: OrganizationErrorBoundary,
+ children: [
+ {
+ Component: () => {
+ const { role } = use(CurrentUser);
+ switch (role) {
+ case Role.EMPLOYEE:
+ return ;
+ case Role.AUDITOR:
+ return ;
+ default:
+ return ;
+ }
+ },
+ },
+ {
+ path: "settings",
+ Fallback: PageSkeleton,
+ Component: lazy(
+ () => import("./pages/iam/organizations/settings/SettingsLayout"),
+ ),
+ children: [
+ {
+ index: true,
+ loader: () => {
+ // eslint-disable-next-line
+ throw redirect("general");
+ },
+ },
+ {
+ path: "general",
+ Component: lazy(
+ () =>
+ import("./pages/iam/organizations/settings/GeneralSettingsPageLoader"),
+ ),
+ },
+ {
+ path: "members",
+ Component: lazy(
+ () =>
+ import("./pages/iam/organizations/settings/MembersPageLoader"),
+ ),
+ },
+ {
+ path: "saml-sso",
+ Component: lazy(
+ () =>
+ import("./pages/iam/organizations/settings/SAMLSettingsPageLoader"),
+ ),
+ },
+ {
+ path: "scim",
+ Component: lazy(
+ () =>
+ import("./pages/iam/organizations/settings/SCIMSettingsPageLoader"),
+ ),
+ },
+ ],
+ },
+ ...riskRoutes,
+ ...measureRoutes,
+ ...documentsRoutes,
+ ...peopleRoutes,
+ ...vendorRoutes,
+ ...frameworkRoutes,
+ ...taskRoutes,
+ ...assetRoutes,
+ ...dataRoutes,
+ ...auditRoutes,
+ ...meetingsRoutes,
+ ...nonconformityRoutes,
+ ...obligationRoutes,
+ ...continualImprovementRoutes,
+ ...rightsRequestRoutes,
+ ...processingActivityRoutes,
+ ...statesOfApplicabilityRoutes,
+ ...compliancePageRoutes,
+ ...snapshotsRoutes,
+ {
+ path: "*",
+ Component: PageError,
+ },
+ ],
},
],
},
+
// Fallback URL to the NotFound Page
{
path: "*",
diff --git a/pkg/server/api/connect/v1/v1_resolver.go b/pkg/server/api/connect/v1/v1_resolver.go
index 24a90c35a..f0ae97ea7 100644
--- a/pkg/server/api/connect/v1/v1_resolver.go
+++ b/pkg/server/api/connect/v1/v1_resolver.go
@@ -410,13 +410,9 @@ func (r *mutationResolver) SignIn(ctx context.Context, input types.SignInInput)
var err error
session, _, err = r.iam.SessionService.OpenPasswordChildSessionForOrganization(ctx, session.ID, *input.OrganizationID)
if err != nil {
- var errSessionExpired *iam.ErrSessionExpired
var errMembershipNotFound *iam.ErrMembershipNotFound
var errMembershipInactive *iam.ErrMembershipInactive
- if errors.As(err, errSessionExpired) {
- return nil, gqlutils.Unauthenticated(ctx, err)
- }
if errors.As(err, errMembershipNotFound) || errors.As(err, errMembershipInactive) {
return nil, gqlutils.Forbidden(ctx, err)
}